Haskell 使用 foldr 计算长度抛出类型错误

标签 haskell types compiler-errors parametric-polymorphism monomorphism-restriction

尝试通过foldr函数实现列表计数

lengthList = foldr (\x s -> s + 1) 0 

给出以下错误

   * Ambiguous type variable `t0' arising from a use of `foldr'
  prevents the constraint `(Foldable t0)' from being solved.
  Relevant bindings include
    lengthList :: t0 a -> Integer (bound at lenListFoldr.hs:2:1)
  Probable fix: use a type annotation to specify what `t0' should be.
  These potential instances exist:
    instance Foldable (Either a) -- Defined in `Data.Foldable'
    instance Foldable Maybe -- Defined in `Data.Foldable'
    instance Foldable ((,) a) -- Defined in `Data.Foldable'
    ...plus one other
    ...plus 23 instances involving out-of-scope types
    (use -fprint-potential-instances to see them all)
* In the expression: foldr (\ x s -> s + 1) 0
  In an equation for `lengthList':
      lengthList = foldr (\ x s -> s + 1) 0

我该如何解决?

最佳答案

添加类型签名:

lengthList :: [a] -> Int

或类似的东西。错误指出:“可能的修复:使用类型注释来指定‘t0’应该是什么。”换句话说,编译器无法推断类型。或者,如评论所述:在上下文中使用函数,然后编译器将使用上下文为 lengthList 推断正确的类型。我相信函数 foldr 使用类约束 Foldable t;在您的情况下,编译器不知道 lengthList 正在折叠什么。通过上面的签名,您将 t0 绑定(bind)为一个列表。看一下 GHCi 给出的输出

:t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b

简而言之,GHC 可以找出a 未被使用,b 是一个Num,但它不知道t

关于Haskell 使用 foldr 计算长度抛出类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52369203/

相关文章:

haskell - 在 Haskell 中执行一系列操作时的异常处理

c++ - C/C++ 中的类型转换到底是什么?

types - 在 Rust 中构建异构类型列表

vb.net - 在标准表达式中获取数据类型不匹配

sqlite - Yesod/Persistent 中的外键约束?

haskell - 为什么在 MonadState 中使用 MultiParamTypeClasses

c - 不同环境下程序输出的差异

maven - Thorntail没有运行以进行集成测试,但是我有一个正在运行的项目相同的pom.xml

haskell - Agda 的停机问题?

haskell - 与分数相关的类型错误