尝试通过文件夹功能实现列表计数
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
我该如何解决?
答案 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
未使用而a
是b
,但它不知道Num
。
答案 1 :(得分:3)
可以通过类型定义来解决:
lengthList :: (Foldable t, Num a1) => t a2 -> a1
这很奇怪,但是如果只是将函数粘贴到解释器中,则无需类型定义就可以了