3

私は現在これを読んでいますが、正直なところ私は何を見るのに苦労しています

class Eq a where 
  (==)                  :: a -> a -> Bool

達成する、それ

instance Eq Integer where 
  x == y                =  x `integerEq` y

達成しません。2番目のコードは、2つの整数型で等式を実行した結果がどうあるべきかを定義していることを理解しています。その時の最初の目的は何ですか?

4

4 に答える 4

8

宣言には、class「いくつかの異なるタイプで機能する一連の関数を定義する」と書かれています。宣言には、「これらの関数がこのタイプinstanceでどのように機能するか」と記載されています。

あなたの特定の例でclass Eqは、「」は「」Eqという名前の関数を持つすべての型を意味しますが、==instance Eq Integerこれは」==の動作方法Integerです。

于 2012-09-21T14:08:12.243 に答える
4

1つ目は、型が同等であるために比較できるようにするために提供する必要のある操作を定義します。次に、それを使用して、整数だけでなく、同等性に匹敵する任意の型で動作する関数を作成できます。

allSame :: Eq a => [a] -> Bool
allSame [] = []
allSame (x:xs) = foldr True (==x) xs

のインスタンスが存在するため、この関数は整数に対して機能しますEq Integer。のインスタンスが存在するため、文字列([Char])に対しても機能しEq Char、のインスタンスを持つタイプのリストのインスタンスEqも存在します(instance Eq a => Eq [a])。

于 2012-09-21T11:25:00.640 に答える
2

1つのクラスがあり、さまざまなタイプのインスタンスが多数あります。そのため、クラスは必要な署名を指定し(インターフェース、クラスはデフォルトの実装を指定することもできますが、それは重要ではありません)、本体(実装)をインスタンス化します。次に、クラス名を制約として使用します。これは、「操作aを実装するすべてのタイプEq、つまりインスタンスがEq」を意味します。

HaskellまたはRealWorldHaskellを学びましょう。haskell.orgチュートリアルよりも優れています。

于 2012-09-21T11:22:28.943 に答える
0

ジェネリックアルゴリズムまたはデータ構造を実装したいとします。「ジェネリック」はポリモーフィックを意味します。どのデータ型でも機能するはずです。たとえば、3つの入力値が等しいかどうかを判断する関数を作成するとします。

特定の(単相)ケースを取り上げると、整数に対してこれを行うことができます。

eq3 :: Int -> Int -> Int -> Bool
eq3 x y z = x == y && y == z

もちろん、上記の定義は他のタイプでも機能することが期待されますが、関数を任意のタイプに適用する必要があることをコンパイラーに指示するだけの場合は、次のようになります。

eq3 :: a -> a -> a -> Bool
eq3 x y z = x == y && y == z

...コンパイラは、==関数がジェネリックに適用されないと文句を言いますa

<interactive>:12:49:
    No instance for (Eq a)
      arising from a use of `=='
    In the first argument of `(&&)', namely `x == y'
    In the expression: x == y && y == z
    In an equation for `eq3': eq3 x y z = x == y && y == z

a型が型クラスのインスタンスであることをコンパイラに通知する必要があります。これは、関数が宣言されている場所であることにすでに気付いています。ここで違いを参照してください:Eq==

eq3 :: Eq a => a -> a -> a -> Bool
eq3 x y z = x == y && y == z

これで、型クラスaに属するすべての型で均一に動作できる関数ができました。Eq

于 2012-09-23T20:17:26.570 に答える