关于Haskell中~和@运算符的问题
他们到底做什么?我知道@的一个可能用法(在模式匹配开始时指定一个名称),但在~上找不到任何内容 我在以下代码片段中找到了它们,摘自,但本文假设您精通Haskell语法,并且不需要解释其深奥的运算符(我感到困惑的部分是sieve声明的开始):关于Haskell中~和@运算符的问题,haskell,operator-keyword,primes,sieve,Haskell,Operator Keyword,Primes,Sieve,他们到底做什么?我知道@的一个可能用法(在模式匹配开始时指定一个名称),但在~上找不到任何内容 我在以下代码片段中找到了它们,摘自,但本文假设您精通Haskell语法,并且不需要解释其深奥的运算符(我感到困惑的部分是sieve声明的开始): primesPT()=2:primes' 哪里 素数'=筛[3,5..]素数'9 筛(p:xs)ps@((uu:t)q |p让f~(:t)=t在f[] ***异常::1:4-15:模式(\uT)的无可辩驳模式失败 运算符~使匹配延迟。通常,模式匹配会对参数进
primesPT()=2:primes'
哪里
素数'=筛[3,5..]素数'9
筛(p:xs)ps@((uu:t)q
|p
从本质上讲,~(\uu:t)
将始终匹配,即使输入是空列表[]
。当然,如果您不知道自己在做什么,这是危险的:
Prelude> let f ~(_:t) = t in f []
*** Exception: <interactive>:1:4-15: Irrefutable pattern failed for pattern (_ : t)
Prelude>让f~(:t)=t在f[]
***异常::1:4-15:模式(\uT)的无可辩驳模式失败
运算符~
使匹配延迟。通常,模式匹配会对参数进行求值,因为需要检查模式是否失败。如果在模式前面加上~
,则在需要之前不会求值。此功能通常在代码中使用,其中需要引用尚未使用c的结构已创建。如果模式在评估时失败,则结果为未定义
以下是一个例子:
f (_:_) = True
f [] = False
g ~(_:_) = True
g [] = False
f[]
产生False
,而g[]
产生true,因为第一个模式总是匹配的。(实际上,您会收到此代码的警告)
这就是说,您可以将~
视为!
的对立面,这会强制对参数进行求值,即使它是不需要的
请注意,这些运算符仅在其应用的级别上严格/懒惰,而不是递归地。例如:
h ~((x,y):xys) = ...
元组上的模式匹配是严格的,但cons模式是懒惰的。是查找不可搜索内容的好地方
h ~((x,y):xys) = ...