2011-05-28 16 views
8

Ben şu kod işe beklemiyorduk:Haskell, neden Num okurken Int okumak için varsayılan görünüyor?

foo :: (Num a) => a -> a 
foo x = x + x 

main = do 
    print (foo (read "7")) 

tamamen koduna göre ("7" okuyun) türünü anlaması mümkün değildir, çünkü. Ancak GHC (6.12.3) aksi düşünmez ve yazdırır. 14

"7", "7.2" olarak değiştirilirse, kod "ayrıştırmak yok" ile başarısız olur. Burada neler oluyor? Haskell, hangi Okuma örneğinin kullanılacağına nasıl karar verir?

+0

'(Num bir bir oku) => [Char] -> a 'açıkça belirsizdir. Bir şekilde karar vermek zorundadır, bu yüzden "Int" ın "Num" için varsayılan olduğu sanırım. Belki de tipeclass'ın ilk örneği olduğu için? Manuel arama yapmaya gidiyorum. Onun ilginç bir soru. – alternative

+0

Sadece kayıt için: varsayılan olarak "Tamsayı" değil, "Int" anlamına gelir. – sepp2k

cevap

12

Bu, Haskell'in defaulting rules for the Num class kaynaklıdır. Eğer dosyanın başına

default (Double, Integer) 

eklendi, o zaman aşağıdaki sonuçlar alırsınız: Özetle

main = do 
    print (foo (read "7")) -- prints "14.0" 
    print (foo (read "7.2")) -- prints "14.2" 

, varsaymak kurallar "doğru olanı yapmaya çalışacağım yönelik olduğu belirtildi "ve programınızda belirsiz bir türünüz olduğunda sizi derleme hatasından kurtarırım. Ne yazık ki bu durumda, bir çalışma zamanı hatası için bir derleme zamanı hatası gerçekleştirir.

Öyle gibi varsaymak devre dışı bırakabilirsiniz: açıkça tip ek açıklamalar üzerinden bu tür terimlerin türlerini belirsizliği için zorlar

default() 

:

print (foo (read "7" :: Int)) 
2

Int, bu örnekte varsayılan türdür. Bkz. 6.3, Haskell'in Tarihinde Belirsizlik ve Tip Belirleme: Sınıf ile Tembellik Olmak:

+2

Noy 'Int', ancak 'Tamsayı' varsayılan değerdir. – augustss

+4

Bu referans için teşekkürler. İşte böyle bir Haskell olmayan özelliği neden dahil ettiklerini açıklığa kavuşturan cümle: "Sabitler üzerinde sayısal hesaplamalar yapmak, bir Haskell programcının yaptığı ilk şeylerden biridir." Yani, 2 + 2'de ghci başarısız olması bazı insanları kapatabilir. – Owen

İlgili konular