_foldr :: (a -> b -> b) -> b -> [a] -> b
_foldr op z [] = z
_foldr op z (x:xs) = x `op` _foldr op z xs
嗨,我们考虑上面的代码。 后:
ghci> _foldr + 0 [1]
我收到了错误:
No instance for (Num t0) arising from the literal `1'
The type variable `t0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Num Double -- Defined in `GHC.Float'
instance Num Float -- Defined in `GHC.Float'
instance Integral a => Num (GHC.Real.Ratio a)
-- Defined in `GHC.Real'
...plus three others
基本上我理解它意味着什么,我想改变功能的签名可以修复它。
但是,我不想改变签名。如何以另一种方式解决它?
答案 0 :(得分:0)
无论您的_foldr方法是否符合您的要求,您都可以在问题中修复问题(没有(Num t0)的实例),而不是通过更改函数的签名(你是对的,这个函数)可以保持多态),但是通过指定要用于GHCi中的调用的类型。当你输入1
时,GHCi不知道你想要的Num类型;你想要整数,还是加倍?因此,您可以使用类型来标注1以指示类似
_foldr (+) 0 [1::Int]
例如,与Ints合作。