2013-04-29 5 views
5

Каков правильный способ использования монады «ap» в Haskell? Я хочу сделать что-то похожее на это:Haskell Quine: «ap» Monad

main = (putStr . ap (++) show) "main = (putStr . ap (++) show) " 

но я получаю сообщение об ошибке «Не в области:« ap ».

Использование «import Control.Monad» ничего не делает. И я попытался дать ему

"ap :: Monad m => m (a -> b) -> m a -> m b" 

тогда я получаю «тип подписи для` ар»не имеет сопроводительной связывания»

ответ

8

Control.Monad Импорт должен дать вам ap. Тем не менее, во всех, кроме самых последних версий GHC (7.6.1 и новее), вам также потребуется импортировать Control.Monad.Instances, чтобы использовать экземпляр monad для функций.

В качестве альтернативы, вы можете импортировать Control.Applicative, который дает <*> оператор, который ap обобщается на Applicative, а также необходимые экземпляры, чтобы использовать его с функциями.

+2

И, наоборот, если мы хотим избежать импорта, вместо импорта какого-либо модуля мы можем просто использовать '(\ fgx -> fx (gx))' (комбинатор S, который '(<*>)' и 'ap' являются тип его типовых версий). –

+0

Большое спасибо! – GossJ

+0

@sacundim: Кто бы пересмотрел стандартную библиотечную функцию только для «избежания импорта»? Я имею в виду, что вам понадобится импорт в любом случае для любых нетривиальных программ –