Frage

Diese Frage stellt sich, während das neue Kapitel in der ausgezeichneten Lesen Lernen Sie eine Haskell über applicative functors.

Die Applicative typeclass hat, als Teil der Definition für das Maybe Beispiel:

pure = Just

Wenn ich gehen Sie einfach auf GHCi und Import Control.Applicative, und zu tun:

pure (3+)

ich nicht bekommen, nur etwas (sinnvoll). Aber wenn ich es in einem Teil des Ausdrucks verwenden:

pure (3+) <*> Just 4

Bekomme ich nur 7. Ich denke, es ist auch nicht verwunderlich ist, aber ich bin etwas fehlt Integral darüber, wie typeclasses arbeiten, glaube ich, dass es keine Zweideutigkeit mit dem Aufruf ist hier pure.

Wenn meine Verwirrung Sinn macht, kann jemand erklären, was im Detail passiert?

War es hilfreich?

Lösung

Es ist nur Folgerung geben. Der (<*>) Bediener erfordert beiden Argumente die gleiche Applicative Instanz zu verwenden. Die rechte Seite ist ein Maybe, so dass die linke Seite hat auch ein Maybe sein. Also das ist, wie es herausfindet, welche Instanz hier verwendet wird. Sie können durch Eingabe von :t expression im Interpreter in der Art eines Ausdrucks suchen, und vielleicht, wenn Sie gerade durch die einzelnen subexpression gehen und Blick auf die Art, die geschlossen wurde, werden Sie ein besseres Bild von dem, was vor sich geht.

Andere Tipps

Es lohnt sich auf die Art der Suche der Compiler für pure (3+) folgert:

Prelude Control.Applicative> :t pure (3+)
pure (3+) :: (Num a, Applicative f) => f (a -> a)

Der Typ dieses Begriffs ist überlastet, und die Entscheidung über die numerische Klasse und die applicative Klasse wird erst später verzögert. Sie können jedoch einen bestimmten Typen mit einer Anmerkung erzwingen, zum Beispiel:

*Showfun Control.Applicative> pure (3+) :: Maybe (Double -> Double)
Just <function>

(Dies funktioniert, weil Showfun eine Instanz Deklaration hat, die einen Funktionswert als <function> druckt.)

Es ist nur eine Frage, wann der Compiler genügend Informationen, um eine Entscheidung angesammelt hat.

Um ein wenig auf newacct Antwort zu erweitern, wenn es nicht genügend Informationen, die tatsächliche Art zu schließen, kann der Compiler (in einigen Fällen) zu versuchen, einen Standardtyp zu wählen, beschränkt auf diejenigen, die die Art Zwänge in Frage genügen würde . In diesem Fall ist der Typ abgeleitet IO (n -> n) für einige schwer zu bestimmen Instanz von Num => n. GHCi wertet sie dann und führt den Rückgabewert, ohne sichtbaren Effekt weg.

Hier ist eine interessante SO auf Typinferenz fädeln. Nicht Haskell spezifisch, aber viele gute Links und Sachen über Typinferenz in funktionalen Sprachen zu lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top