容器元素类型

问题描述:

从某种意义上说,这是从我之前的问题中倒退出来的,但是......有人会提醒我为什么这个不是工作?容器元素类型

 
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

尝试使用它。您很快会收到有关模糊超载的投诉。 – augustss 2012-01-31 10:54:34

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

“啊,但我只有instance Container [Int] Int,”你说。 “而且一个instance Container [Int] Char无论如何都是一个bug。”

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

因此,我们需要告知

  • Container第一参数唯一确定的Container
  • 第二个参数编译器的一些方法,如果它看到的区别仅在于第二类不同的情况下,指示一个bug

输入函数依赖关系。

+0

我知道我必须忘记一些明显的东西...... – MathematicalOrchid 2012-01-31 11:09:19