2016-04-16 9 views
1

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?

+0

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

+0

Danke! Würde es Ihnen etwas ausmachen, eine Antwort zu posten, damit ich sie annehmen kann? – kai

Antwort

5

Es ist auf zwei Eigenschaften GHCI:

  1. type defaulting, die Num b => b-Integer löst (beachten Sie, dass 1 tatsächlich fromInteger 1 ist und Sie definieren können - aber nicht unverbindliche - eine Art numerische Daten in dem fromInteger 1 + fromInteger 1 == k und show k == "3", so ist dies wichtig):
  2. das ganze ghci läuft in IO-Monad, und if an expression can be instantiated to an IO action, then it will be, so Applicative f => f ist aufgelöst zu IO. Wenn der Ausdruck vom Typ C1 f => f a ist und IO keine Instanz dieses Typs Klasse C1 ist, wird ghci einen Mehrdeutigkeitsfehler auslösen.