我是Haskell的新手,所以这个问题对于大多数Haskell程序员来说应该是相当简单的:我有一个函数digits :: Integer -> [Int]
可以将整数转换为其数字列表(123到[1,2,3]).现在得到我sum $ digits 123
在ghci中输入的那些数字的总和,一切正常,它输出6.然而,一旦我在文件中创建函数如下,我得到一个错误.这可能与ghci推断123的类型这一事实有关,但这还不够,所以我可以解决问题.
文本文件中的函数:
digitalSum :: Integer -> Int digitalSum = sum $ digits
和错误:
* Couldn't match type `[Int]' with `Integer -> Int' Expected type: Integer -> Integer -> Int Actual type: Integer -> [Int] * In the second argument of `($)', namely `digits' In the expression: sum $ digits In an equation for `digitalSum': digitalSum = sum $ digits
sepp2k.. 5
虽然sum $ digits 123
在GHCi中工作(就像它在Haskell文件中一样),sum $ digits
(也可以写得很好sum digits
)在GHCi中也不起作用.
问题是sum
需要一个数字列表,但digits
不是列表,它是一个函数.
你想要digitalSum x = sum $ digits x
或者digitalSum = sum . digits
.这.
是函数组合运算符,它从两个现有函数中创建一个函数(相反$
,它接受函数及其参数,而不是另一个函数).
虽然sum $ digits 123
在GHCi中工作(就像它在Haskell文件中一样),sum $ digits
(也可以写得很好sum digits
)在GHCi中也不起作用.
问题是sum
需要一个数字列表,但digits
不是列表,它是一个函数.
你想要digitalSum x = sum $ digits x
或者digitalSum = sum . digits
.这.
是函数组合运算符,它从两个现有函数中创建一个函数(相反$
,它接受函数及其参数,而不是另一个函数).