Haskell中==和=之间的差异

时间:2011-05-13 05:50:07

标签: haskell operator-overloading equality ghci

我仍然无法理解Haskell中===之间的区别。我知道前者与重载类型有关​​,而后者“给出了函数的结果”,但我似乎无法理解它!任何帮助将不胜感激。

5 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:1)

==是为了平等

示例:比较两个整数

=是作业

示例:为变量赋值整数

答案 3 :(得分:1)

我还不是Haskell专家,但与大多数其他语言一样,==是一个产生truefalse的比较运算符,而=是赋值运算符,在Haskell中归结为函数声明。

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

答案 4 :(得分:1)

==是一个运算符,用于比较两个事物是否相等。这是非常正常的haskell函数,类型为“Eq a => a - > a - > Bool”。该类型告诉它它适用于实现Eq类型类的每种类型的值,因此它有点重载。

=另一方面,=赋值运算符,用于引入定义。