Ich bin ein wenig verwirrt durch diese Sache in GHCI, wenn Sie Funktionen einer bestimmten Typklasse verwenden, aber nicht angeben, welchen konkreten Typ Sie wollen. Betrachten Sie den folgenden Code ein:Auf Ergebnisse von generischen Funktionen in Ghci aufrufen
pure (1+) <*> pure 1
> 2
So wie ich es verstehe, wenn man etwas in GHCI eingeben, wertet sie den Ausdruck und ruft putStrLn . show
darauf. Aber wie kann das bewertet werden? Warum ist das 2? Ich meine, es macht Sinn und es ist wahrscheinlich 2 für die meisten Anwendungsfälle, aber es gibt keine Möglichkeit, sicher zu wissen, oder? Wenn wir die Art des Ausdrucks überprüfen wir bekommen:
pure (1+) <*> pure 1 :: (Num b, Applicative f) => f b
OK, fair genug, sehen die Typen vernünftig, aber es gab nie irgendeine Art Klasseninstanz angegeben, so wie haben GHCI/Haskell wissen, was zu nennen funktionieren, wenn Ich schrieb pure
/<*>
?
Intuition aus anderen Sprachen sagen, dass dies ein Fehler sein sollte. Ein bisschen wie der Versuch, eine Instanzmethode statisch in einer OOP-Sprache aufzurufen (offensichtlich nicht dasselbe, aber es ist diese Art von Gefühl, das ich bekomme).
Was geht hier vor?
Es ist Typ defaulting https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/interactive-evaluation.html#extended-default-Rules. Außerdem wird 'f' in 'IO' aufgelöst, da ghci in IO monad läuft. – zakyggaps
Danke! Würde es Ihnen etwas ausmachen, eine Antwort zu posten, damit ich sie annehmen kann? – kai