2015-05-12 6 views
9

Es stellt sich heraus, dass in GHC 7.10, diese fein kompiliert:Warum führt die freie Version der Funktion von Haskell zu einem mehrdeutigen Typfehler?

mysum xs = foldr (+) 0 xs 

Aber diese:

mysum = foldr (+) 0 

Ergebnisse in dem folgenden Fehler:

No instance for (Foldable t0) arising from a use of ‘foldr’ 
The type variable ‘t0’ is ambiguous 
Relevant bindings include 
    mysum :: t0 Integer -> Integer (bound at src/Main.hs:37:1) 
Note: there are several potential instances: 
    instance Foldable (Either a) -- Defined in ‘Data.Foldable’ 
    instance Foldable Data.Functor.Identity.Identity 
    -- Defined in ‘Data.Functor.Identity’ 
    instance Foldable Data.Proxy.Proxy -- Defined in ‘Data.Foldable’ 
    ...plus five others 
In the expression: foldr (+) 0 
In an equation for ‘mysum’: mysum = foldr (+) 0 

Warum dies geschieht, und Was ist die Erkenntnis, die durch das Verständnis dieses Unterschieds erreicht wird? Kann ich dieser Funktion auch einen Typ geben (der immer noch generisch ist), damit dieser Fehler verschwindet?

+9

* Die gefürchtete Monomorphie Einschränkung schlägt wieder * – AJFarmar

+1

Ich dachte, , in neueren GHC wurde die Monomorphie-Beschränkung standardmäßig deaktiviert? – arrowd

+3

@arrowdodger, Sie haben einen Buchstaben verpasst: In der letzten GHCi ist die Monomorphie-Beschränkung standardmäßig deaktiviert. –

Antwort

11

Wie bei Fällen, in denen eine gut typisierte Funktion ohne Punktfehler zu Typfehlern bei nicht erfüllten Einschränkungen der Typklasse führt, ist die letzte Ursache dafür monomorphism restriction, standardmäßig aktiviert.

Sie können dies entweder lösen eine Art Signatur mysum Zusatz:

mysum :: (Foldable f, Num a) => f a -> a 

oder durch die Monomorphie Einschränkung ausschalten:

{-# LANGUAGE NoMonomorphismRestriction #-} 
+0

Hier ist ein Beispiel für eine verwandte Situation: https: // stackoverflow. com/questions/6052670/ – Cactus

+0

Sign ... Monomorphie Einschränkung. Was für ein Name. – Ana

+0

@Ana: Es klingt viel erschreckender als es ist, und es kommt viel *. Und keine Überraschung: Es ist willkürlich und unnatürlich, also wird es dich stolpern, wenn du nichts davon weißt. Deshalb nennen es Leute die * gefürchtete * Monomorphismus-Einschränkung :). –

Verwandte Themen