与haskell文字等号
当我加载一个文件时,在GHCi中会发生什么事情?文件的行是:0=1 我原以为这会出错,但它似乎什么也没做。它有什么作用吗与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”。这有什么作用?您的
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