2013-04-29 3 views
5

Qual è il modo corretto di utilizzare la monade "ap" in Haskell? Voglio fare qualcosa di simile a questo:Haskell Quine: "ap" Monad

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

ma ottengo l'errore "Non soggetto: 'ap'."

L'utilizzo di "import Control.Monad" non fa nulla. E ho provato dando

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

tanto sono "La firma tipo per` ap' manca un accompagnamento vincolante"

risposta

8

Importazione Control.Monad dovrebbe darvi ap. Tuttavia, in tutte le versioni più recenti di GHC (7.6.1 e successive), è necessario importare anche Control.Monad.Instances per utilizzare l'istanza monad per le funzioni.

In alternativa, è possibile importare Control.Applicative che vi dà l'operatore <*>, che è ap generalizzato a Applicative, così come le istanze necessarie per utilizzarlo con le funzioni.

+2

E in alternativa, se vogliamo evitare le importazioni, invece di importare entrambi i moduli possiamo semplicemente usare '(\ fgx -> fx (gx))' (il combinatore S, che '(<*>)' e 'ap' sono tipo versioni generiche di classe). –

+0

Grazie mille! – GossJ

+0

@sacundim: chi ridefinire una funzione di libreria standard solo per "evitare le importazioni"? Voglio dire, avrai bisogno di importare comunque per qualsiasi programma non banale –