在应用程序中键入错误

时间:2011-09-27 11:58:36

标签: haskell

我正在尝试使用这段haskell代码,但是我不断收到此错误消息:

> ERROR file:.\4.hs:9 - Type error in application
> Expression     : fact n div (fact m * fact (n - m))
> Term           : fact
> Type           : Int -> Int
> Does not match : a -> b -> c -> d

以下是代码:

fact :: Int -> Int
fact q 
 | q == 1 = 1
 | otherwise = q * fact(q-1)

comb :: Int -> Int -> Int
comb n m
 | n < m = error "undefined as n < m"
 | otherwise = ((fact n) div ((fact m) * (fact (n - m))))

知道怎么解决吗?

3 个答案:

答案 0 :(得分:5)

问题是div在最后一行。

当你想创建一个函数中缀时,你必须在`之间写它。因此,只需将最后一行更改为:

| otherwise = ((fact n) `div` ((fact m) * (fact (n - m))))

答案 1 :(得分:2)

您使用div作为中缀,但它不是运算符,因此您必须这样写:

comb :: Int -> Int -> Int
comb n m
 | n < m = error "undefined as n < m"
 | otherwise = fact n `div` (fact m * fact (n - m))

或者像这样:

comb :: Int -> Int -> Int
comb n m
 | n < m = error "undefined as n < m"
 | otherwise = div (fact n) (fact m * fact (n - m))

答案 2 :(得分:0)

你有

 | otherwise = ((fact n) div ((fact m) * (fact (n - m))))

但它应该是

 | otherwise = ((fact n) `div` ((fact m) * (fact (n - m))))

(至少)

基本上,您使用的是中缀运算符,您必须使用反引号对其进行标记。

但是,在这种情况下,为了减少parantheses的数量,我会把它重写为

 | otherwise = div (fact n) $ (fact m) * (fact (n - m))

修改:s/inline/infix