2015-06-04 16 views
5

iGHCi yılında

let xs = [1, 'a'] 

hemen hatayı şikayet yazın:

Ancak
<interactive>:28:11: 
No instance for (Num Char) arising from the literal ‘1’ 
In the expression: 1 
In the expression: [1, 'a'] 
In an equation for ‘xs’: xs = [1, 'a'] 

, ben sadece geçti

let xs = [1, [1, 1]] 

yazarken.

<interactive>:5:1: 
No instance for (Num [t0]) arising from a use of ‘it’ 
In a stmt of an interactive GHCi command: print it 

ben Haskell nedenle tüm hata derleme zamanında yakalandı edilmelidir statik tip dil ​​olduğunu düşünüyorum: Ben xs yazdırmaya çalıştığınızda Ve şikayet ediyor. Yukarıdaki 2 hataların neden farklı zamanda yakalandığını merak ediyorum?

cevap

8

1, Num a => a türünde bir polimorfik değerdir. Yani [1, [2, 3]]’da [2, 3] :: Num a => [a]’umuz var; tüm liste öğeleri aynı türe sahip olması gerektiğinden, 1 :: Num a => [a] olmalıdır. Bu biraz garip - bir liste türü olarak 1 düşünmek garip, ama birileri yeterince garip bir örnek Num oluşturursa, mükemmel geçerli olabilir. Örneği kullanmaya çalışıncaya kadar bir örneğin var olup olmadığını kontrol etmek; Bu, örneği kullanarak değeri tanımladıktan sonra örneği tanımlamanıza olanak tanır. Yani aslında [1, [2, 3]] listesinden bir şeyler yapmaya çalışıncaya kadar şikayet etmiyor.

Sadece ne demek istediğimi göstermek için, tek yazabilirsiniz:

GHCi içinde, (Nitekim bu örnek herhangi Applicative için çalışır ve bazen hatta yararlıdır.) Sonra
instance Num a => Num [a] where 
    fromInteger n = pure (fromInteger n) 
    (+) = liftA2 (+) 
    (-) = liftA2 (-) 
    (*) = liftA2 (*) 
    abs = liftA abs 
    signum = liftA signum 

:

> let xs = [1, [1, 1]] 
> xs 
[[1],[1,1]] 

Bak ma, hata yok!

+3

Neden aynı neden mantıklı bir 'Num Char' örneği için geçerli değil? –

+0

@ReidBarton İyi soru! Aslında bundan emin değilim. Örnek kararda, GHC'nin monomorfik kısıtlamalar için kanıt bulmayı geciktirmeyi reddettiğini tahmin ediyorum; ama bu sadece bir tahmin. –

+0

'Enum Char' örneğine dayalı bir' Num Char' örneği tanımlayabilirsiniz. Aynı mantık geçerlidir, ancak örnek burada yer almamaktadır. –