Diese Frage entstand beim Lesen des neuen Kapitels im ausgezeichneten Learn You a Haskell über anwendungsorientierte Funktoren.Woher weiß Haskell, welche Typklasseninstanz Sie meinen?
Die Applicative hat typeclass, als Teil der Definition für die Maybe Beispiel:
pure = Just
Wenn ich gehen Sie einfach auf GHCi und Import Control.Applicative, und zu tun:
pure (3+)
I don Hab nichts (macht Sinn). Aber wenn ich es in einem Teil der Ausdruck verwenden:
pure (3+) <*> Just 4
I Just bekommen 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 Anruf an pure
hier.
Wenn meine Verwirrung Sinn macht, kann jemand erklären, was im Detail passiert?
Ah, so tut der Compiler etwas wie "Hmm, der Typ dieses Arguments ist mehrdeutig, also lasst mich den nächsten Argumenttyp überprüfen und zurückkommen"? –
Typ-Inferenz ist ziemlich komplex, aber es ist wissenswert, dass es nicht in einem Schritt geschieht. Der Typ-Inferenzrechner sammelt normalerweise einige Informationen in einem Schritt und zu einem späteren Zeitpunkt einige weitere Informationen. Es ergibt also nicht nur von links nach rechts die richtigen Typen für alles auf einmal.In diesem Fall wird es folgern, dass "rein" vom Typ "(Applicative a1) => a1 (Int -> Int)" ist, wobei "a1" nur eine erfundene Typvariable ist, zu einem späteren Zeitpunkt während der Typinferenz wird schließen, dass 'a1'' Maybe' sein muss, und dann wird es 'Maybe' für' a1' überall ersetzen. –
Danke - das ist sehr hilfreich! –