容器元素类型
问题描述:
从某种意义上说,这是从我之前的问题中倒退出来的,但是......有人会提醒我为什么这个不是工作?容器元素类型
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
显然,如果它是那么容易,没有人会打扰到创造函数依赖,也没有相关的类型。那么上面的问题是什么?
答
没有什么可以阻止您添加instance Container [Int] Int
和instance 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
尝试使用它。您很快会收到有关模糊超载的投诉。 – augustss 2012-01-31 10:54:34