【发布时间】:2023-03-26 18:14:01
【问题描述】:
考虑以下 Haskell 代码:
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances,
FunctionalDependencies #-}
class C a b c | a b -> c
instance C (l (i,j)) (r i j) j
instance C (l i j) (r (i,j)) j
-- Conflict between the following two lines
instance C (l (i,j)) (r (i,j)) j
instance C (l i j) (r i j) j
这里,GHC 在最后两行之间产生了函数依赖错误。 如果我删除最后两个实例声明中的任何一个,代码就会编译。我尝试了一个使用类型族的类比,这也产生了冲突。我的第一个问题是:为什么最后两行冲突,而其他声明都可以正常工作?
另外,如果我把最后一行改成
instance C (l i j) (r i j) i
GHC 接受该代码。 这看起来很奇怪,因为唯一改变的是依赖类型变量 c。有人可以解释这种行为吗?
【问题讨论】:
-
只是为了确定。如果您同时删除前两个实例,仍然会出现错误,对吧?
-
@genisage 是的,它只取决于最后两个实例
-
我无法在这里复制第二部分。
instance C (l i j) (r i j) i给我带来了冲突。 (在 ghc 7.8.3 上) -
@genisage 这里没有冲突,还有 ghc(i) 7.8.3
-
@ØrjanJohansen 我又试了一次,还是有冲突。我目前正在使用 windows 和 Haskell 平台。
标签: haskell functional-dependencies type-families