as パターン

Haskell には「as パターン」というものがあります。論より証拠で実例を見ていただきましょう。これは前に投稿した記事へのコメントから引用しています。

fib@(_ : tf) = 1 : 1 : zipWith (+) fib tf

アットマークが as パターンです。

この時 fib はどんなリストになっているでしょうか。とりあえず
s = zipWith (+) fib tf
と置くことにして、ちょっと追いかけてみましょう。最初は
fib = 1 : 1 : s
となっているはずです。したがって
tf = 1 : s
なので zipWith (+) の定義から s の最初の要素は 2 とわかります。

ということは
fib = 1 : 1 : 2 : ss
tf = 1 : 2 : ss
(s = 2 : ss と置いた)
なので s の 2 番目の要素(= ss の最初の要素)は 3 ですね。

fib = 1 : 1 : 2 : 3 : sss
tf = 1 : 2 : 3 : sss
(ss = 3 : sss と置いた)
だから s の 3 番目の要素(= sss の最初の要素)は 5 です。

…という風に、fib というリストにフィボナッチ数列が出来上がっていく様子がわかります。

as パターンはいろいろな場面で使えるのでぜひお試しあれ。