Что именно они делают? Я знаю одно возможное использование @ (назначение имени в начале сопоставления с образцом), но не смог ничего найти на ~.
Я нашел их в следующем фрагменте кода, взятом из http://www.haskell.org/haskellwiki/Prime_numbers, но в статье предполагается, что вы свободно владеете синтаксисом Haskell и не удосужились объяснить его эзотерические операторы (часть, которая меня смущает, — это начало объявления для 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)
Будем очень признательны за любое объяснение (или ссылку на него) используемого здесь синтаксиса.