2016-04-13 23 views
0

Haskell'de zil numarası bulucu + toplamı uygulamaya çalışıyorum. Yöntemlerimin doğru olduğundan eminim, fakat derleme zamanında bazı hatalarla ilgili problem yaşıyorum. Benim şu anki hata iletisim:Haskell Bell Numaralarının Uygulanması

[1 of 1] Compiling Main    (survey2.hs, survey2.o) 
survey2.hs:5:14:** 
    Expected a constraint, but ‘Integer’ has kind ‘*’ 
    In the type signature for ‘binomial’: 
     binomial :: (Integer, Integer) => Integer 

survey2.hs:15:12: 
    Expected a constraint, but ‘Integer’ has kind ‘*’ 
    In the type signature for ‘bellSum’: bellSum :: Integer => Integer** 

Genelde işlevsel dillere haskell ve yeni dillerden tamamen yeniyim. Bu hataya dayanarak, "işlev tanımlarımı" değiştirmeyi denedim (ya da onları Haskell'de aradığınızda), ama daha fazla hataya neden oluyor gibi görünüyorum.

Programın son hedefi, 0-9 arasındaki zil sayısının toplamını yazdırmaktır.

bu tutarlı olmadığını
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 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) 
+0

Bir işlev türü için sembol '->' değil, '=>' dır. '=>' typeclass kısıtlamaları için (ki daha önce öğrenmediğinizi tahmin ediyorum). – luqui

+0

Ve '(Tamsayı, Tamsayı) -> Tamsayı 'işlevi için bir tanım binom (n, k) = ...' gibi görünüyor. Sahip olduğunuz bir "Tamsayı -> Tamsayı -> Tamsayı" işlevine karşılık gelir (haskell içinde, çok daha yaygın bir modeldir). – luqui

+0

[LYAH] (http://learnyouahaskell.com/) şiddetle tavsiye edilir. – luqui

cevap

1

Notu (=> olmalıdır ->)

binomial :: (Integer, Integer) -> Integer 
binomial n k 

ya değişim

binomial :: Integer -> Integer -> Integer 
binomial n k 

veya

binomial :: (Integer, Integer) -> Integer 
binomial (n, k) 

Eğer sizin için başka ipucu

için c Bir hesaplama faktöriyel fonksiyonu olmadan binom (hatta çarpma)

binomial n k | k==0 || k==n = 1 
      | k==1 = n 
      | otherwise = binomial (n-1) (k-1) + binomial (n-1) k 

bu hala çok verimsiz ama memoized edilebilir.

+0

Teşekkür ederiz. Tamsayı -> Tamsayı -> Tamsayı vs (Tamsayı, Tamsayı) -> Tamsayı için herhangi bir büyük avantajlar/dezavantajlar? Programımı (n, k) ve şimdi aynı program ile farklı bir sorun alıyorum. Yeni bir soru açmalı mı yoksa mevcut olanı değiştirmeli miyim? Soru için uygun görgü kurallarından emin değilim. –

+1

Eğer iki argüman doğal değilse, Haskell'de daha doğal ve daha esnek olacak olan 'Tamsayı -> Tamsayı -> Tamsayı' kullanmak daha iyidir. – karakfa