簡體   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