2011-10-30 24 views
6

PolyTypeable, polimorfik türler için Typeable'ın bir benzetimidir. Hatta çok benzer,polyTypeOf, gizemli

ghci> :t show 
show :: Show a => a -> String 
ghci> polyTypeOf show 
a1 -> [Char] 
ghci> :t fromEnum 
fromEnum :: Enum a => a -> Int 
ghci> polyTypeOf fromEnum 

<interactive>:1:12: 
    Ambiguous type variable `a0' in the constraint: 
     (Enum a0) arising from a use of `fromEnum' 
    Probable fix: add a type signature that fixes these type variable(s) 
    In the first argument of `polyTypeOf', namely `fromEnum' 
    In the expression: polyTypeOf fromEnum 
    In an equation for `it': it = polyTypeOf fromEnum 

kütüphane kaynak kodu anlamak oldukça zordur neden polyTypeOf argümanlar belli kümesi kabul etmez açıklayabilir ve diğer kabul başarısız: Ama doğrusu tahmin edilemez çalışır?

cevap

7

nedeni yani

Prelude> show undefined 
"*** Exception: Prelude.undefined 
Prelude> fromEnum undefined 

<interactive>:0:1: 
    Ambiguous type variable `a0' in the constraint: 
     (Enum a0) arising from a use of `fromEnum' 
    Probable fix: add a type signature that fixes these type variable(s) 
    In the expression: fromEnum undefined 
    In an equation for `it': it = fromEnum undefined 

aynıdır, GHCi en ancak bir Enum kısıtlaması için, kurallar bir Show kısıtlaması için belirsizliği çözmek için izin varsaymak uzatıldı. Bir kaynak dosyasını foo = polyTypeOf show ile derlemeye çalışırsanız, belirsiz bir tür değişken hatası da alırsınız ({-# LANGUAGE ExtendedDefaultRules #-}'u kullanmadığınız sürece).

+0

Güzel örnek. . – luqui

+0

Teşekkürler, bunu düşünmedim çünkü 'polyTypeOf show','() -> String' gibi varsayılan bir şey değil. – modular

+0

Ve polyEnum'den polyTypeOf ve benzeri bir iş yapmanın bir yolu var mı? belki bazı varsayılan (...) 's ayarlayarak? – Wizek

İlgili konular