私はまだHaskellの==
との違いに頭を悩ませています。=
前者はオーバーロードされた型であることと関係があり、後者は関数の「結果を与える」ことを知っていますが、私はそれを理解できないようです! どんな助けでも大歓迎です。
5 に答える
=
は Haskell の特別な予約記号で、「定義されている」という意味です。定義を導入するために使用されます。つまり、他の値や関数の定義で参照できる新しい値や関数を作成するために使用します。
==
は予約シンボルではなく、タイプ のありきたりの関数ですEq a => a -> a -> Bool
。たまたま型クラス( Eq
) で宣言されていますが、特別なことはありません。の組み込み宣言を非表示にして、==
必要に応じて再定義できます。ただし、通常は「等しい」を意味し、型クラスの一部であるため、特定の型に対して「等しい」ことを意味するように定義 (オーバーロード) できます。
例えば:
data Foo = Foo Int
instance Eq Foo where
(Foo x) == (Foo y) = x == y
以前はfor !=
を定義していたことに注意してください。==
Foo
違いを考える簡単な方法は、コンパイル時に同等性を=
アサートするのに対し、実行時==
に同等性をチェックすることです。
=
割り当てを実行します。または定義はおそらくより良い言葉です。一度しかできません。これは特別な演算子/記号です。それは関数ではありません
==
typeclass の 2 つの入力を取りEq
、bool を返す関数で、通常は挿入されます。
Prelude> let a = 1
Prelude> a
1
Prelude> 5 == 5
True
Prelude> 5 == 6
False
Prelude> :t (==)
(==) :: (Eq a) => a -> a -> Bool
私はまだ Haskell の専門家ではありませんが、他のほとんどの言語と同様に、 はor==
を生成する比較演算子であり、 whileは代入演算子であり、Haskell では関数宣言に要約されます。true
false
=
ghci> 5 == 5
true
ghci> "foo" == "bar"
false
ghci> let foo = "bar"
== は、2 つのものが等しいかどうかを比較するための演算子です。これは、「Eq a => a -> a -> Bool」型のごく普通の haskell 関数です。型は、Eq 型クラスを実装する値のすべての型で機能することを示しているため、一種のオーバーロードです。
一方、= は代入演算子であり、定義を導入するために使用されます。
== は平等です
例: 2 つの整数の比較
= は代入
例: 整数を変数に割り当てる