【发布时间】:2013-01-04 19:30:52
【问题描述】:
有了函数依赖,我可以声明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'?如果是这样,怎么做?如果不是,为什么不产生编译错误?
【问题讨论】:
-
都不应该编译,
foo1和foo2的类型意味着a的不同类型。你的意思是a -> b -> c和a -> c? -
@DanielFischer 哎呀!你是对的。现在已经修好了。
-
b无法从foo2'访问,因此只有在存在指定要使用的实例的直接方法时才能确定实例。可能有一些ConstraintKinds魔法,我不知道,但我对此表示怀疑。那么,不,你永远不能打电话给foo2'。为什么它不会产生编译错误,我不确定,但我认为是编译器无法证明你永远不能明确地调用foo2'。
标签: haskell typeclass functional-dependencies