2017-03-05 3 views
3

Meine Funktion funktioniert nicht. Ich habe viele verschiedene Typ-Signaturen ausprobiert. Wenn ich die Typ-Signatur entferne, funktioniert sie nicht mit einer Punktnummer als "p".Haskell Type Signature Fehler

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) 

Inferred Typ ist nicht allgemein genug

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

Wenn ich den Typ Signature entferne ich bekommen:

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

Aber wenn ich ein:

bTable 50 0.8 10 

ich

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

Es sind keine automatischen Typumwandlungen in Haskell. Wenn Sie "a * b" haben, müssen "a" und "b" vom selben Typ sein. Wie erhoffen Sie sich einen "Integral" -Typ von "0.8" in einer Potenz multipliziert mit etwas anderem? –

Antwort

4

Verwenden fromIntegral den Rückgabewert von ncr etwas konvertieren Sie mit Num a => a Werten multiplizieren können.

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

Hinweis die abgeleitete Typ dieser Funktion ist dann

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

die von Ihrem versucht deklarierten Typ ist etwas anders (mit zum Vergleich mit dem eingangs genannten Art umbenannt Einschränkungen)

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