Есть ли в Haskell какой-нибудь общий класс типов Hashable? (также известный как «вывод (Hashable)»)

Кто-нибудь писал универсальную функцию, чтобы хеш-функции могли автоматически создаваться для пользовательских типов данных (с использованием производных механизм)? Несколько раз я писал следующий тип шаблона,

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)

Edit 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 ].

6
задан gatoatigrado 25 May 2011 в 07:12
поделиться