2013-04-29 23 views
5

Was ist der richtige Weg, um die "ap" Monade in Haskell zu verwenden? Ich möchte etwas ähnliches tun:Haskell Quine: "ap" Monad

aber ich bekomme den Fehler "Nicht im Bereich: 'ap'."

Mit "Import Control.Monad" tut nichts. Und ich habe versucht, es

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

dann ich geben bekommen „Die Art Signatur für` ap‘fehlt eine verbindliche begleitende“

Antwort

8

importieren Control.Monad sollten Sie ap geben. In allen außer den neuesten Versionen von GHC (7.6.1 und neuer) müssen Sie jedoch Control.Monad.Instances importieren, um die Monad-Instanz für Funktionen zu verwenden.

Alternativ können Sie Control.Applicative importieren, die Ihnen die <*> Betreiber gibt, die ap zu Applicative verallgemeinert, sowie die notwendigen Fällen ist es mit Funktionen zu nutzen.

+2

Oder, wenn wir Importe vermeiden wollen, können wir anstelle von jedem Modul einfach '(\ fgx -> fx (gx))' (den S-Kombinator, der '(<*>)' und 'ap' sind) verwenden type class-generische Versionen davon). –

+0

Vielen Dank! – GossJ

+0

@sacundim: Wer würde eine Standardbibliotheksfunktion neu definieren, nur um Importe zu vermeiden? Ich meine, du wirst sowieso Importe für alle nicht-trivialen Programme brauchen. –