【发布时间】:2016-01-26 03:31:48
【问题描述】:
我想实现一个数据结构,当我注册它时会给我一个“签名”,因此我可以:
- 查询签名是否存在
- 合并两个这样的 DS,同时保持正确的行为
- 删除给定的签名
可能有点模糊,但很容易实现,比如用 Java 实现,如下所示:
class Sig {}
class DesiredDS<A> {
HashMap<Sig, A> map = new HashMap<>();
public Sig insertWithNewSig(A a) {
Sig s = new Sig();
map.put(s, a);
return s;
}
// ...
// merge will be only to merge to map and delete will be only to delete the key
}
但我摸不着头脑,不知道如何在 Haskell 中使用参考透明度的属性来做到这一点。
有什么好主意吗?可能对此的等效答案是:如何在 Haskell 中生成一个可以比较相等的数据结构,而我不需要费心决定它的值?
【问题讨论】:
-
你也可以这样做——唯一的区别是你传递了
HashMap(或者你选择在Haskell中保持你的关联的任何结构)——现在你可以变得花哨了,把在您自己的结构中(〜DesiredDS),使用State-Monad(变压器)为您保存地图,... -
这些签名应该是什么样的?大随机数?
-
听起来像
(Monoid v, Monad m) => StateT (HashMap Sig v) m a,具体取决于您的实际merge行为。
标签: haskell