2016-04-13 19 views
0

i alıyorum kodumu derlemeye çalışırken:Haskell: beklenen ulaşamasa tip gerçek tip 'IO t0' 'Integer'

[1 of 1] Compiling Main    (survey2.hs, survey2.o) 

survey2.hs:20:1: 
    Couldn't match expected type ‘IO t0’ with actual type ‘Integer’ 
    In the expression: main 
    When checking the type of the IO action ‘main’ 

Ben '9 belirterek ile karıştırmasını denedim “IO, IO t, IO t0, int, vb. dahil olmak üzere bir dizi farklı türde ana girişe girdikçe, başka yerlerde sahip olduğum işlev tanımlarına dayanarak, bir Tamsayı fonksiyona girmediğimi anlıyorum. Diğer işlevlerin hiçbiri düzgün çalışmayacaktır. Eminim, ana yazıya nasıl uygun yazılır.

factorial:: Integer -> Integer 
factorial n 
    | n <= 1 = 1 
    | otherwise = n * factorial(n-1) 

binomial :: (Integer, Integer) -> Integer 
binomial (n, k) 
    | k > n  = 0 
    | k < 0  = 0 
    | otherwise = factorial(n)/(factorial(n-k) * factorial(k)) 

bell :: Integer -> Integer 
bell n 
    | n <= 1 = 1 
    | otherwise = sum [ binomial(n-1, k-1) * bell (k-1) | k<-[0..n-1] ] 

bellSum :: Integer -> Integer 
bellSum n = sum [ bell(k) | k<-[0..n] ] 

main = bell(9 :: Integer) 

cevap

5

main (genellikle Main adlandırılır) ana modülünde ise, tip IO a (genellikle IO()) olması gerekir.

bell 9'dan beri, Integer tipi eşleşmiyor. Sen IntegerIntegerprint :: Show a => a -> IO () ile yazdırmak gerekiyor:

main = print (bell 9) 

Not (/) o Integer için çalışmaz, bunun yerine div kullanmak gerekir:

| otherwise = factorial(n) `div` (factorial(n-k) * factorial(k))