2017-01-16 21 views
0

中工作我是Haskell的新手,所以这个问题对于大多数Haskell程序员来说应该是相当平凡的: 我有一个函数digits :: Integer -> [Int]它转换一个整数到它的数字列表(123到[1,2,3])。现在得到这些数字的总和,我输入sum $ digits 123 ghci,一切正常,它输出6.然而,当我在一个文件中创建如下函数时,我收到一个错误。这可能与ghci推断123的类型有关,但这还不够,所以我可以解决这个问题。无法匹配`[Int]'Integer - > Int'但在GHCI

在一个文本文件中的函数:

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 
+1

另见:[* Haskell:区别。 (点)和$(美元符号)*](http://stackoverflow.com/q/940382/2751851) – duplode

回答

5

尽管sum $ digits 123在GHCi中工作(就像它将在Haskell文件中一样),sum $ digits(也可以写成sum digits)在GHCi中也不起作用。

问题是sum取一个数字列表,但digits不是一个列表,它是一个函数。您需要digitalSum x = sum $ digits xdigitalSum = sum . digits。这里.是函数组合运算符,它从两个现有函数中创建一个函数(与$相反,它采用函数及其参数,而不是另一个函数)。

3

你忘了论证

digitalSum :: Integer -> Int 
digitalSum x = sum $ digits x 

或者,你可以使用函数组合

digitalSum :: Integer -> Int 
digitalSum = sum . digits 
相关问题