Кто-нибудь писал универсальную функцию, чтобы хеш-функции
могли автоматически создаваться для пользовательских типов данных (с использованием производных
механизм)? Несколько раз я писал следующий тип шаблона,
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)
Спасибо всем за очень полезные ответы. Я попробую добавить общий метод в качестве упражнения, когда у меня будет время. На данный момент (возможно, что имел в виду sclv?), Я понял, что могу написать немного лучший код,
instance Hashable LeafExpr where
hash (Var name) = hash ("Leaf-Var", name)
hash Star = hash "Leaf-Star"
Используя ghc, умножение на случайные простые числа работает намного лучше, чем кортеж в редактировании 1 . Конфликты с Data.HashTable выросли с 95% (очень плохо) до 36%. Код находится здесь: [ http://pastebin.com/WD0Xp0T1 ] [ http://pastebin.com/Nd6cBy6G ].