与haskell文字等号

与haskell文字等号,haskell,equality,literals,Haskell,Equality,Literals,当我加载一个文件时,在GHCi中会发生什么事情?文件的行是:0=1 我原以为这会出错,但它似乎什么也没做。它有什么作用吗 我假设它在GHCi中等同于说“让0=1”。这有什么作用?您的let绑定中的0实际上是文本0上的模式匹配。我一开始也不确定发生了什么,但你可以通过使用严格的模式匹配来确认这一点,比如: Prelude> :set -XBangPatterns Prelude> let !0 = 1 in 0 *** Exception: <interactive>:1

当我加载一个文件时,在GHCi中会发生什么事情?文件的行是:0=1

我原以为这会出错,但它似乎什么也没做。它有什么作用吗


我假设它在GHCi中等同于说“让0=1”。这有什么作用?

您的
let
绑定中的
0
实际上是文本
0
上的模式匹配。我一开始也不确定发生了什么,但你可以通过使用严格的模式匹配来确认这一点,比如:

Prelude> :set -XBangPatterns 
Prelude> let !0 = 1 in 0
*** Exception: <interactive>:13:5-10: Non-exhaustive patterns in pattern binding
Prelude>:设置-XBangPatterns
序曲>让我来!0=0中的1
***异常::13:5-10:模式绑定中的非穷举模式

如果给失败的模式匹配一个名称
x
,也可以这样强制它:

x @ 0 = 1
main = print x
这会产生错误:

FILE.hs: /path/to/FILE.hs:1:5-13: Irrefutable pattern failed for pattern x@0

0=1
只是一个模式绑定

语文报告还指出:

模式绑定将变量绑定到值。一个简单的模式绑定的形式是p=e。模式p作为一个无可辩驳的模式被“惰性地”匹配,就好像它前面有一个隐含的~一样

因此,
0=1
中的
0
只是一种模式。本质上,
0=1
x=1
是一回事。它们都是模式绑定。
模式是无可辩驳的,
0=1
没有失败,因此没有发生错误,也没有发生任何事情

如果我们有以下顶级声明。事情会发生的

x@(Just y) | z /= Nothing = Just 1
  where
    z = Just 0
x
y
仅绑定到
1
和1


pat     →   lpat qconop pat         (infix constructor)
    |   lpat

lpat    →   apat
    |   - (integer | float)         (negative literal)
    |   gcon apat1 … apatk      (arity gcon  =  k, k ≥ 1)

apat    →   var [ @ apat]       (as pattern)
    |   gcon        (arity gcon  =  0)
    |   qcon { fpat1 , … , fpatk }      (labeled pattern, k ≥ 0)
    |   literal
    |   _       (wildcard)
    |   ( pat )         (parenthesized pattern)
    |   ( pat1 , … , patk )         (tuple pattern, k ≥ 2)
    |   [ pat1 , … , patk ]         (list pattern, k ≥ 1)
    |   ~ apat      (irrefutable pattern)

fpat    →   qvar = pat 
x@(Just y) | z /= Nothing = Just 1
  where
    z = Just 0