2011-05-13 68 views
5

我在Haskell中找到===之間的區別還是有困難。我知道前者與被超載的類型有關,而後者是「給出了結果」的功能,但我似乎無法讓我的頭靠近它!任何幫助將非常感激。Haskell中==和=的區別

+0

注意,很多語言,而不僅僅是Haskell中,略有不同的定義,這些運營商。值得注意的是,Erlang在大多數其他語言將使用的地方使用'=' – 2011-05-13 23:59:33

回答

15

=是在Haskell一個特殊的保留符號意爲「被定義爲」。它用於介紹定義。也就是說,您可以使用它來創建新的值和函數,這些值和函數可以在其他值和函數的定義中引用。

==不是保留符號,只是Eq a => a -> a -> Bool類型的普通功能。它恰好在type classEq)中聲明,但沒有什麼特別的。您可以隱藏==的內置聲明並將其重新定義爲您想要的任何內容。但通常它意味着「等於」,並且因爲它是類型類的一部分,所以您可以將它定義(重載)爲意味着您希望「平等」意味着您的特定類型的任何內容。

例如:

data Foo = Foo Int 

instance Eq Foo where 
    (Foo x) == (Foo y) = x == y 

注意我用了=定義爲==Foo

認爲差異的精闢的方式是=斷言在編譯時平等,而==檢查在運行時平等。

1

==是平等

例如:比較兩個整數

=是賦值

例如:賦值給一個變量

+5

我會在「賦值」上使用「定義」一詞。 'x = 4'表示「x被定義爲4」。這很重要,因爲分配意味着它在什麼情況下很重要,哪些事情沒有。 – luqui 2011-05-13 06:06:20

1

我不太一個Haskell專家又一個整數,但是與其他大多數語言一樣,==是比較運算符,產生truefalse,而=是賦值運算符,它在Haskell中歸結爲函數聲明。

ghci> 5 == 5 
true 
ghci> "foo" == "bar" 
false 
ghci> let foo = "bar" 
1

==是一個運算符,用於比較兩個事物是否相等。類型爲「Eq a => a - > a - > Bool」是非常正常的haskell函數。該類型告訴它它適用於實現Eq類型類型的每種類型的值,因此它有一種重載。

另一方面,=是一個賦值運算符,它用於引入定義。

2

=執行分配。或定義可能是一個更好的詞。只能做一次。這是一個特殊的操作符/符號。它不是一個功能

==是一個函數,通常infixed,這需要類型類Eq的兩個輸入,並返回一個布爾

Prelude> let a = 1 
Prelude> a 
1 
Prelude> 5 == 5 
True 
Prelude> 5 == 6 
False 
Prelude> :t (==) 
(==) :: (Eq a) => a -> a -> Bool