无法使新数据类型Hashable

Eld*_*dar 6 haskell

尝试在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)
Run Code Online (Sandbox Code Playgroud)

失败了

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)’
Run Code Online (Sandbox Code Playgroud)

怎么了?

Jak*_*nge 8

Data.Hashable的hackage文档声明Hashable的最小实现是函数hashWithSalt- 查看类型类声明(class Hashable a where)下的文档.

所以,如果你改变你的功能hashWithSalt,一切都应该工作:

instance (Hashable v) => Hashable (Edge v) where
  hashWithSalt s (Edge x1 x2) = s + (hash x1) + (hash x2)
Run Code Online (Sandbox Code Playgroud)