2015-05-12 15 views
9

O ghc 7.10 yılında, bu ince derler çıkıyor şu hataylaHaskell neden fonksiyonun serbest versiyonunu belirsiz tip hataya yol açıyor?</p> <pre><code>mysum xs = foldr (+) 0 xs </code></pre> <p>Ama bu:

mysum = foldr (+) 0 

sonuçları:

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 

Bunun nedeni nedir ve Bu farkı anlayarak elde edilen anlayış nedir? Ayrıca, bu hatayı bu hatayı gidermek için bir tür (hala jenerik) verebilir miyim?

+9

* korkulan monomorfizm kısıtlama tekrar saldırmadan * – AJFarmar

+1

düşündüm Son GHC'de monomorfizm kısıtlaması varsayılan olarak kapatıldı mı? – arrowd

+3

@arrowdodger, bir mektup özlediniz: son GHCi'de monomorfizm kısıtlaması varsayılan olarak kapalıdır. –

cevap

11

Her zamanki gibi, iyi yazılan bir işlev noktasının noktasının aniden yapılmaması durumunda, yerine getirilmemiş typeclass kısıtlamaları hakkında tür hataları oluşur, bunun en büyük nedeni, varsayılan olarak etkin olan monomorphism restriction'dur.

Sen mysum bir tip imza ekleyerek ya bu çözebilir:

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

veya monomorfizm kısıtlama kapatarak:

{-# LANGUAGE NoMonomorphismRestriction #-} 
+0

İlgili bir durum örneği: https: // stackoverflow. com/questions/6052670/ – Cactus

+0

İşaret ... monomorfizm kısıtlaması. Ne isim ama. – Ana

+0

@Ana: Bundan çok daha korkutucu geliyor, ve geliyor * çok *. Ve sürpriz değil: Bu keyfi ve doğal değil, bu yüzden bunu elden bilmediğiniz sürece size yol gösterecek. İşte bu yüzden insanlar buna * korkuyor * monomorfizm kısıtlaması :). –