gpt4 book ai didi

haskell - Haskell 中是否有任何通用的 Hashable 类型类? (又名 "deriving (Hashable)")

转载 作者:行者123 更新时间:2023-12-04 15:47:58 33 4
gpt4 key购买 nike

有没有人写过一个通用函数以便hash可以为自定义数据类型自动生成函数(使用 deriving 机制)?有几次,我写了以下样板,

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 生成 serialization 的软件包之一将值转换为二进制的代码,然后使用 hashable 散列二进制数组.

关于haskell - Haskell 中是否有任何通用的 Hashable 类型类? (又名 "deriving (Hashable)"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6094630/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com