Haskell中类型的歧义

时间:2016-03-05 11:00:39

标签: haskell

_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

基本上我理解它意味着什么,我想改变功能的签名可以修复它。

但是,我不想改变签名。如何以另一种方式解决它?

1 个答案:

答案 0 :(得分:0)

无论您的_foldr方法是否符合您的要求,您都可以在问题中修复问题(没有(Num t0)的实例),而不是通过更改函数的签名(你是对的,这个函数)可以保持多态),但是通过指定要用于GHCi中的调用的类型。当你输入1时,GHCi不知道你想要的Num类型;你想要整数,还是加倍?因此,您可以使用类型来标注1以指示类似

的类型
_foldr (+) 0 [1::Int]

例如,与Ints合作。