2

Haskellでunion-findデータ構造を実装しています。

パラメータ化された型を使用したかったのですが、パラメータとして使用するオブジェクトを比較しようとすると、少し問題が発生します。

data UnionFindElement valueType =
    RootElement valueType |
    ElementWithParent valueType (UnionFindElement valueType)

holds :: UnionFindElement valueType -> valueType -> Bool
holds (RootElement v) value = v == value

平等は定義されていないようです。

No instance for (Eq valueType)
  arising from a use of `=='
In the expression: v == value

valueTypeを制限して、定義された等式関係を持つタイプのみを考慮するにはどうすればよいですか?

4

2 に答える 2

4

holds :: (Eq valueType) => UnionFindElement valueType -> valueType -> Bool

(Eq valueType) =>意味valueTypeはクラスEq(同等の値) からのものであり、構造は正確にジェネリック パラメーターの型を制限できるように存在します。

これは、データ宣言や他のいくつかの場所でも機能することに注意してください。詳細については、 http://en.wikibooks.org/wiki/Haskell/Classes_and_types#Type_constraintsをご覧ください。

より一般的な概要については、http://en.wikipedia.org/wiki/Type_classおよびhttp://en.wikipedia.org/wiki/Ad-hoc_polymorphismを参照してください。

于 2012-12-16T19:58:34.097 に答える
3

Vladislavの優れた答えに加えて、型がわからないような問題に直面したとき、私はしばしば型を省略し、コードをGHCiにロードして(控えめに:))尋ねることでHaskellの型推論機能を利用しますHaskell は、それが何を推測したか教えてくれました。つまり、次のコードholdsを GHCi に入れます。このコードは、 の明示的な型がないことを除いて、あなたのコードとまったく同じです:

data UnionFindElement valueType =
    RootElement valueType |
    ElementWithParent valueType (UnionFindElement valueType)

holds (RootElement v) value = v == value

タイプを確認します。

ghci> :t holds
holds :: Eq a => UnionFindElement a -> a -> Bool

これは、アルファ置換以外は、まさにウラジスラフが与えたものです。

于 2012-12-17T12:43:36.363 に答える