繁体   English   中英

关于Haskell中〜和@运算符的问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM