2014-04-03 1 views
6

Ich versuchte this stackoverflow answer mit GHCI zu überprüfen und die folgenden Fehlermeldung erhalten:Fehler in GHCI, die ich nicht in schriftlicher Haskell-Datei wiedergeben

> import Data.List 
> let m = head . sort 
> m [2,3,4] 

<interactive>:5:4: 
    No instance for (Num()) arising from the literal `2' 
    Possible fix: add an instance declaration for (Num()) 
    In the expression: 2 
    In the first argument of `m', namely `[2, 3, 4]' 
    In the expression: m [2, 3, 4] 

Leider kann ich den Fehler nicht in einer schriftlichen Haskell-Datei wiedergeben:

-- file.hs 
import Data.List 

main = do 
    let m = head . sort 
    putStrLn $ show $ m [2,3,4] 

Das Ausführen dieser Datei mit runhaskell file.hs gibt mir den erwarteten Wert 2. Was ist mein Fehler in der Ghci-Sitzung?

Edit: ich festgestellt, dass die Funktion m eine seltsame Art in GHCI hat:

> import Data.List 
> let m = head . sort 
> :t m 
m :: [()] ->() 

Warum ist dies der Fall? Sollte es nicht den Typ Ord a => [a] -> a haben? Für sort und head ich die erwarteten Typen:

> :t sort 
sort :: Ord a => [a] -> [a] 
> :t head 
head :: [a] -> a 
+5

Die gefürchtete Monomorhismus-Restriktion schlägt erneut zu. Versuchen Sie, eine ': set -XNoMonomorphismRestriction 'auszuführen, bevor Sie Ihren Code in ghci ausführen. – fjh

+0

@fjh: Jetzt funktioniert es! Vielen Dank! –

Antwort

7

Dies ist die Schuld der Monomorphismus Beschränkung gefürchtet. Da Sie keinen Typ für m angegeben haben, schätzt GHCi es für Sie. In diesem Fall rät es, dass m den Typ [()] ->() haben sollte, obwohl das eindeutig nicht das ist, was Sie wollen. Geben Sie einfach m eine Signatur in GHCi und Sie werden in Ordnung sein.

> :set +m -- multiline expressions, they're handy 
> let m :: Ord a => [a] -> a 
|  m = head . sort 

Sie können die Monomorphismus Einschränkung deaktivieren mit

> :set -XNoMonomorphismRestriction 

Aber es ist in der Regel ziemlich praktisch, sonst haben Sie viele Arten für Dinge, die Sie normalerweise nicht im interaktiven Modus zu spezifizieren.

+0

Können Sie erklären, warum Ghci rät '' [()] ->() ''? –

+5

Grundsätzlich, weil es der "einfachste" Typ ist, der die Beschränkungen erfüllt, die von Ord a => [a] -> a auferlegt werden. – nomen

+0

@normen: danke! –

Verwandte Themen