无法将`[Int]'与`Integer - >匹配Int'但在GHCI工作

时间:2017-01-16 14:39:36

标签: haskell

我是Haskell的新手,所以这个问题应该对大多数Haskell程序员来说都是微不足道的: 我有一个函数digits :: Integer -> [Int],它将一个整数转换为其数字列表(123到[1,2,3])。现在得到我在ghci中输入sum $ digits 123并且一切正常的数字的总和,它输出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

2 个答案:

答案 0 :(得分:5)

虽然sum $ digits 123适用于GHCi(就像在Haskell文件中一样),sum $ digits(也可以写成sum digits)在GHCi中不起作用任

问题在于sum会列出一个数字列表,但digits不是列表,而是一个函数。

您需要digitalSum x = sum $ digits xdigitalSum = sum . digits。这里.是函数组合运算符,它从两个现有函数中创建一个函数(而不是$,它接受​​一个函数及其参数,而不是另一个函数)。

答案 1 :(得分:3)

你忘记了论点

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

或者,您可以使用功能组合

digitalSum :: Integer -> Int
digitalSum = sum . digits