2013-04-29 10 views
5

Jaki jest właściwy sposób użycia monady "ap" w Haskell? Chcę zrobić coś podobnego do tego:Haskell Quine: "ap" Monad

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

, ale pojawia się błąd "Nie w zakresie:" ap "."

Użycie "import Control.Monad" nic nie robi. i próbowałem nadając mu

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

potem dostać „Podpis dla typu` ap”brakuje towarzyszący wiązanie”

Odpowiedz

8

Importowanie Control.Monad powinno dać ap. Jednak we wszystkich, oprócz najnowszych wersji GHC (7.6.1 i nowszych), musisz również zaimportować Control.Monad.Instances, aby użyć instancji monad dla funkcji.

Można importowania Control.Applicative co daje operatorowi <*>, który ap uogólnione Applicative, jak również niezbędne przypadkach stosowanie jej funkcji.

+2

Alternatywnie, jeśli chcemy uniknąć importu, zamiast importować którykolwiek z modułów możemy po prostu użyć '(\ fgx -> fx (gx))' (kombinator S, który '(<*>)' i 'ap' są wpisz ich wersje generyczne-klasyczne). –

+0

Dziękuję bardzo! – GossJ

+0

@sakundim: Kto przedefiniowałby standardową funkcję biblioteki tylko po to, by "uniknąć importu"? Chodzi mi o to, że i tak będziesz potrzebował importów do nietrywialnych programów. –