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