在某种程度上,这是我之前提出的问题的一个倒退,但是......有人可以提醒我为什么没有工作?
class Container c e where empty :: c insert :: e -> c -> c instance Container [x] x where empty = [] insert = (:) instance Container ByteString Word8 where empty = BIN.empty insert = BIN.cons instance Ord x => Container (Set x) x where empty = SET.empty insert = SET.insert
显然,如果这很容易,没有人愿意发明功能性依赖关系或相关类型。那么上面的问题是什么?
答案 0 :(得分:10)
没有什么可以阻止你添加instance Container [Int] Int
和instance Container [Int] Char
,当你要求empty :: [Int]
时,编译器无法知道它应该来自哪个实例。
instance Container [Int] Int
,”你说。 “而且instance Container [Int] Char
无论如何都会成为一个错误。”
但编译器无法知道您将来不会添加instance Container [Int] Char
,如果这样做,则不允许它破坏现有代码。
所以我们需要某种方式告诉编译器
Container
的第一个参数唯一确定Container
输入功能依赖项。