无法将"[Int]"与"整数 -> Int"匹配,但在 GHCI 中有效



我是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

虽然sum $ digits 123在GHCi中工作(就像在Haskell文件中一样),但sum $ digits(也可以写sum digits)在GHCi中也不起作用。

问题是sum接受一个数字列表,但digits不是一个列表,它是一个函数。

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

你忘记了参数

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

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

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

最新更新