Haskell 使用 foldr 计算长度抛出类型错误
Haskell count length using foldr throw type error
尝试通过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
或类似的东西。错误状态:"Probable fix: use a type annotation to specify what `t0' should be." 换句话说,编译器无法推断类型。或者,如评论所述:在上下文中使用函数,然后编译器将使用上下文为 lengthList
推断正确的类型。我相信函数 foldr
使用 class 约束 Foldable t
;在您的情况下,编译器不知道 lengthList
正在折叠什么。通过上面的签名,您将 t0
绑定为一个列表。看一下 GHCi 给出的输出
:t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
简而言之,GHC 可以计算出 a
是未使用的,而 b
是一个 Num
,但它不知道 t
。
可以通过类型定义来解决:
lengthList :: (Foldable t, Num a1) => t a2 -> a1
这很奇怪,但是如果只是将函数粘贴到解释器中,它可以在没有类型定义的情况下正常工作
尝试通过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
或类似的东西。错误状态:"Probable fix: use a type annotation to specify what `t0' should be." 换句话说,编译器无法推断类型。或者,如评论所述:在上下文中使用函数,然后编译器将使用上下文为 lengthList
推断正确的类型。我相信函数 foldr
使用 class 约束 Foldable t
;在您的情况下,编译器不知道 lengthList
正在折叠什么。通过上面的签名,您将 t0
绑定为一个列表。看一下 GHCi 给出的输出
:t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
简而言之,GHC 可以计算出 a
是未使用的,而 b
是一个 Num
,但它不知道 t
。
可以通过类型定义来解决:
lengthList :: (Foldable t, Num a1) => t a2 -> a1
这很奇怪,但是如果只是将函数粘贴到解释器中,它可以在没有类型定义的情况下正常工作