MultiParamTypeClasses,FunctionalDependencies和调用不明确的函数

时间:2013-01-04 19:30:53

标签: haskell typeclass functional-dependencies

对于功能依赖,我可以声明Foo类:

class Foo a b c | a -> b where
    foo1 :: a -> b -> c
    foo2 :: a -> c

当我致电foo2时,一切正常。由于依赖性,编译器知道要使用哪个实例。

但是,如果我删除依赖项以创建Foo'

class Foo' a b c where
    foo1' :: a -> b -> c
    foo2' :: a -> c

所有内容仍然编译良好,但现在每当我尝试调用foo2' GHC时都会抛出一个错误,指出无法解析使用哪个实例,因为b不明确。

是否可以毫无错误地致电foo2'?如果是这样,怎么样?如果没有,为什么不生成编译错误?

1 个答案:

答案 0 :(得分:3)

在这种情况下调用foo2'是不可能的,因为正如Daniel Fischer所说,没有办法确定使用哪个实例。例如,如果你有:

instance Foo' Int Int Int where
    foo2' x = x

instance Foo' Int Bool Int where
    foo2' x = x + 1

这两个foo2'都有相同的类型签名,因此无法确定要调用哪个。

解决此问题的常用方法是使用代理:

data Proxy a = Proxy

class Foo'' a b c = where
    foo2'' :: Proxy b -> a -> c

你这样使用它来选择哪个实例:

foo'' (Proxy :: Proxy Bool) 42