2011-05-13 89 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