容器元素类型

Mat*_*hid 7 containers haskell types

在某种程度上,这是我之前的问题的一个倒退,但是...有人可以提醒我为什么这不起作用

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

显然,如果这很容易,没有人会想要发明功能依赖或相关类型.那么上面的问题是什么?

dav*_*420 10

没有什么可以阻止你添加instance Container [Int] Intinstance Container [Int] Char,当你要求empty :: [Int]编译器无法知道它应该来自哪个实例.

"啊,但我只有instance Container [Int] Int,"你说." instance Container [Int] Char无论如何,这将是一个错误."

但编译器无法知道您将来不会添加instance Container [Int] Char,如果这样做,则不允许它破坏现有代码.

所以我们需要一些告诉编译器的方法

  • 第一个参数Container唯一确定第二个参数Container
  • 如果它看到只有第二种类型不同的不同实例,则表示存在错误

输入功能依赖项.