[英]Question about the ~ and @ operators in Haskell
他们究竟做了什么? 我知道可能使用@(在模式匹配开始时指定一个名字),但是在〜上找不到任何东西。
我在下面的代码片段中找到了它们,取自http://www.haskell.org/haskellwiki/Prime_numbers ,但是本文假设您能够熟练使用Haskell语法并且不打算解释其深奥的操作符(第一部分) '混淆是筛子宣言的开始):
primesPT () = 2 : primes'
where
primes' = sieve [3,5..] primes' 9
sieve (p:xs) ps@ ~(_:t) q
| p < q = p : sieve xs ps q
| True = sieve [x | x<-xs, rem x p /= 0] t (head t^2)
关于这里使用的语法的任何解释(或链接到一个)将不胜感激。
操作员~
使得比赛变得懒散。 通常,模式匹配会评估参数,因为需要检查模式是否失败。 如果使用~
作为模式的前缀,则在需要之前不会进行评估。 此功能通常用于“绑结”代码,其中需要引用尚未创建的结构。 如果模式在评估时失败,则结果undefined
。
这是一个例子:
f (_:_) = True
f [] = False
g ~(_:_) = True
g [] = False
f []
得到False
,而g []
得到true,因为第一个模式总是匹配。 (您实际上会收到此代码的警告)
也就是说,你可以看到~
与之相反!
,即使不需要,也会强制对论证进行评估。
请注意,这些运算符仅在应用它们的级别上进行严格/延迟,而不是递归。 例如:
h ~((x,y):xys) = ...
元组上的模式匹配是严格的,但缺点模式是懒惰的。
这是一个懒惰的模式匹配 (也称为无可辩驳的模式匹配 ,我认为是更好的名称)。
基本上,即使输入是空列表[]
, ~(_:t)
也将始终匹配。 当然,如果您不知道自己在做什么,这很危险:
Prelude> let f ~(_:t) = t in f []
*** Exception: <interactive>:1:4-15: Irrefutable pattern failed for pattern (_ : t)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.