如何解决Haskell中是否有任何通用的Hashable类型类? 又称“派生可哈希”
| 是否有人编写过通用函数,以便可以针对自定义数据类型自动生成“ 0”函数(使用“ 1”机制)?几次,我写了以下样板data LeafExpr = Var Name | Star deriving (Eq,Show)
instance Hashable LeafExpr where
hash (Var name) = 476743 * hash name
hash Star = 152857
这可以自动生成:基本思想是,每当添加数据时,您都要乘以一个质数,例如与列表,
hash (x:xs) = hash x + 193847 * hash xs
本质上,我想写的是
data LeafExpr = ... deriving (Hashable)
编辑1
谢谢大家的所有非常有帮助的回复。有时间时,我将尝试添加通用方法作为练习。就目前而言(也许是sclv指的是什么?),我意识到我可以编写稍微好一点的代码,
instance Hashable LeafExpr where
hash (Var name) = hash (\"Leaf-Var\",name)
hash Star = hash \"Leaf-Star\"
编辑2
使用ghc,乘以随机质数比在编辑1中纠结要好得多。与Data.HashTable的冲突从95%(非常糟糕)变为36%。代码在这里:[http://pastebin.com/WD0Xp0T1] [http://pastebin.com/Nd6cBy6G]。
解决方法
您需要多少速度?您可以使用使用模板haskell的软件包之一来生成序列化代码,以将值转换为二进制,然后使用hashable哈希二进制数组。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。