2017-03-05 4 views
3

私の機能は動作しません。私は多くの異なるタイプの署名を試みました。タイプシグネチャを削除すると、ポイント番号が「p」として機能しません。Haskell Type Signature Error

:t bTable 
bTable :: Integral a => a -> a -> a -> a 

をしかし、私は入力した場合::

bTable 50 0.8 10 

私が手

fak :: (Num a, Ord a) => a->a 
fak x 
    | x <= 1 = 1 
    | otherwise = x*fak (x-1) 

ncr :: Integral a => a -> a -> a 
ncr n k = (fak n) `div` (fak(n-k) * fak k) 

bTable :: (Integral a, Num b) => a->b->a->a 
bTable n p k = (ncr n k) * p^k * (1-p)^(n-k) 

推測されるタイプは、私は型シグネチャを削除した場合、私は取得

*** Expression : bTable 
*** Expected type : (Integral a, Num b) => a -> b -> a -> a 
*** Inferred type : (Integral a, Num a) => a -> a -> a -> a 

十分に一般的ではありません

Unresolved overloading 
*** Type  : (Fractional a, Integral a) => a 
*** Expression : bTable 50 0.8 10 
+3

若干異なっている

bTable :: (Num a, Integral b) => b -> a -> b -> a 

である注Haskellでは自動型変換はありません。 'a * b 'を持っている場合、' a'と 'b'は同じ型でなければなりません。いくつかの倍率で何か他のものが乗算されたときに、「0.8」から「Integral」型を得る方法はありますか? –

答えて

4

あなたはNum a => a値に掛けることができる何かにncrの戻り値を変換するにはfromIntegralを使用してください。

bTable n p k = fromIntegral (ncr n k) * p^k * (1-p)^(n-k) 

この関数の推論された型は、その後(上記のタイプと比較するために名前を変更した制約付き)あなたが試み宣言された型があり

bTable :: (Num a, Integral b) => b -> a -> b -> b 
関連する問題