容器元素类型

时间:2012-01-31 10:42:33

标签: haskell types containers

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

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

显然,如果这很容易,没有人愿意发明功能性依赖关系或相关类型。那么上面的问题是什么?

1 个答案:

答案 0 :(得分:10)

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

<啊>“啊,但我只有instance Container [Int] Int,”你说。 “而且instance Container [Int] Char无论如何都会成为一个错误。”

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

所以我们需要某种方式告诉编译器

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

输入功能依赖项。