Haskell中==和=之间的差异

Haskell中==和=之间的差异,haskell,operator-overloading,equality,ghci,Haskell,Operator Overloading,Equality,Ghci,我仍然难以理解Haskell中=和=之间的区别。我知道前者与重载类型有关,后者“给出了函数的结果”,但我似乎无法理解它!任何帮助都将不胜感激。==代表平等 示例:比较两个整数 =是赋值 示例:将整数赋给变量我还不是哈斯凯尔专家,但与大多数其他语言一样,=是一个比较运算符,产生真或假,而=是赋值运算符,在哈斯凯尔可以归结为函数声明 ghci> 5 == 5 true ghci> "foo" == "bar" false ghci> let foo = "bar" =是Haske

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

==代表平等

示例:比较两个整数

=是赋值


示例:将整数赋给变量

我还不是哈斯凯尔专家,但与大多数其他语言一样,
=
是一个比较运算符,产生
,而
=
是赋值运算符,在哈斯凯尔可以归结为函数声明

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

=
是Haskell中的一个特殊保留符号,意思是“定义为”。它用于介绍定义。也就是说,您可以使用它创建新的值和函数,这些值和函数可以在其他值和函数的定义中引用

==
不是保留符号,只是类型为
Eq a=>a->a->Bool
的普通函数。它恰好是在(
Eq
)中声明的,但它没有什么特别之处。您可以隐藏
==
的内置声明,并根据需要重新定义它。但通常它的意思是“等于”,因为它是类型类的一部分,所以您可以定义(重载)它来表示您希望“等于”对特定类型的含义

例如:

data Foo = Foo Int

instance Eq Foo where
  (Foo x) == (Foo y) = x == y
注意,我使用
=
Foo
定义
=


考虑差异的一个简单方法是,
=
在编译时断言相等,而
=
在运行时检查相等。

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


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

=
执行赋值。或者定义可能是一个更好的词。我只能做一次。这是一个特殊的运算符/符号。它不是一个函数

=
是一个函数,通常是一个中缀函数,它接受两个typeclass
Eq
输入并返回布尔值

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

我会用“定义”而不是“分配”<代码>x=4表示“x定义为4”。这一点很重要,因为赋值意味着它在发生时很重要,而事实并非如此。值得注意的是,Erlang在大多数其他语言都会使用的地方使用
=