[英]Can't make a new data type Hashable
Attempt to compile the following with ghc 7.8.2 on OS X 10.9.3 尝试在OS X 10.9.3上使用ghc 7.8.2编译以下内容
import Data.Hashable (Hashable, hash)
data Edge v = Edge v v deriving (Show)
instance (Eq v) => Eq (Edge v) where
Edge x1 x2 == Edge y1 y2 =
x1 == y1 && x2 == y2 || x1 == y2 && x2 == y1
instance (Hashable v) => Hashable (Edge v) where
hash (Edge x1 x2) = (hash x1) + (hash x2)
fails with 失败了
Could not deduce (hashable-1.2.1.0:Data.Hashable.Class.GHashable
(GHC.Generics.Rep (Edge v)))
arising from a use of ‘hashable-1.2.1.0:Data.Hashable.Class.$gdmhashWithSalt’
from the context (Hashable v)
bound by the instance declaration at src/MinCut.hs:12:10-42
In the expression:
hashable-1.2.1.0:Data.Hashable.Class.$gdmhashWithSalt
In an equation for ‘hashWithSalt’:
hashWithSalt
= hashable-1.2.1.0:Data.Hashable.Class.$gdmhashWithSalt
In the instance declaration for ‘Hashable (Edge v)’
What is wrong? 怎么了?
The hackage docs for Data.Hashable states that the minimal implementation of Hashable is the function hashWithSalt
— check out the documentation under the typeclass declaration ( class Hashable a where
). Data.Hashable的hackage文档声明Hashable的最小实现是函数
hashWithSalt
- 查看类型类声明下的文档( class Hashable a where
)。
So if you change your function to hashWithSalt
, everything should work: 因此,如果您将函数更改为
hashWithSalt
,一切都应该工作:
instance (Hashable v) => Hashable (Edge v) where
hashWithSalt s (Edge x1 x2) = s + (hash x1) + (hash x2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.