14

他们具体是做什么的?我知道 @ 的一种可能用法(在模式匹配开始时分配名称),但在 ~.

我在以下代码片段中找到了它们,取自http://www.haskell.org/haskellwiki/Prime_numbers,但本文假设您精通 Haskell 语法并且不费心解释其深奥的运算符(我的部分'm 困惑的是sieve声明的开始):

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)

任何关于此处使用的语法的解释(或链接)将不胜感激。

4

2 回答 2

11
于 2011-09-21T21:19:40.273 回答
9

这是一个惰性模式匹配(也称为无可辩驳的模式匹配,我认为这是更好的名称)。

本质上,~(_:t)将始终匹配,即使输入是空列表[]。当然,如果您不知道自己在做什么,这很危险:

Prelude> let f ~(_:t) = t in f []
*** Exception: <interactive>:1:4-15: Irrefutable pattern failed for pattern (_ : t)
于 2011-09-21T21:19:01.073 回答