【问题标题】:Haskell Couldn't match type, that is given by signatureHaskell 无法匹配类型,由签名给出
【发布时间】:2020-05-13 05:07:28
【问题描述】:

好的,大家好,我遇到了一个奇怪的问题。

hist :: [Int] -> [Int]
hist x = (foldr (+) 0 x)

上面的代码不起作用,因为尝试编译我得到了错误,预期类型“[Int]”无法与实际类型“Int”匹配。我不明白。

有趣的事实:当我删除签名时,该功能可以正常工作! 有谁知道错吗?

谢谢!

【问题讨论】:

  • foldr (+) 0 :: Num a => [a] -> a。当您省略类型签名时,会推断出hist 的正确类型。如果要指定具体类型,应该是[Int] -> Int
  • 提示:foldr (+) 0 的返回类型是什么? (如果不确定,可以询问 GHCi。)

标签: list haskell types


【解决方案1】:

foldr (+) 0 x 的输出将是 Int,而不是 [Int]。如果你想要一个列表,你可以使用scanl,但我猜,你还是想要foldr

hist :: [Int] -> Int
hist = foldr (+) 0

然而,我强烈建议使用sum :: (Foldable f, Num a) => f a -> a,它也计算总和,但适用于所有Num 实例的类型,以及所有Foldables(因此不仅仅是一个列表)。

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多