使用文件夹抛出类型错误的Haskell计数长度

时间:2018-09-17 13:43:51

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

尝试通过文件夹功能实现列表计数

template<class T, class P>
class myclass
{
    using ParamT = T;
    using ParamP = P;
};

template<class MyClass>
void otherfunc(MyClass const &mc)
{
    using ParamT = typename MyClass::ParamT;
    using ParamP = typename MyClass::ParamP;
}

出现以下错误

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

我该如何解决?

2 个答案:

答案 0 :(得分:3)

添加类型签名:

user-drag

或类似的东西。错误状态:“可能的解决方法:使用类型注释来指定应为't0'。”换句话说,编译器无法推断类型。或者,如注释所述:在上下文中使用该函数,然后编译器将使用上下文来推断lengthList :: [a] -> Int 的正确类型。我相信函数lengthList使用类约束foldr;在您的情况下,编译器不知道Foldable t正在折叠。通过提供上面的签名,您将lengthList绑定为一个列表。看看GHCi给出的输出

t0

简而言之,GHC可以确定:t foldr foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b 未使用而ab,但它不知道Num

答案 1 :(得分:3)

可以通过类型定义来解决:

lengthList :: (Foldable t, Num a1) => t a2 -> a1

这很奇怪,但是如果只是将函数粘贴到解释器中,则无需类型定义就可以了