Haskellのリストに関して「@」記号はどういう意味ですか?


127

次のようなHaskellコードを見つけました。

ps@(p:pt)

何をしない@シンボルは、この文脈で意味ですか?Googleで情報を見つけることができないようです(残念ながらGoogleでシンボルを検索するのは難しいです)。また、Preludeのドキュメントで関数を見つけることができないので、代わりに何らかの構文上の砂糖である必要があると思います。


14
その特定のシンボルを検索しようとしないでください。Haskellの構文全般を検索し、その全体的な議論からシンボルを見つけます。たとえば、「Haskell構文」の上位のGoogle結果:cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html@そのページのの2番目の出現がそれを説明しています。
ロブ・ケネディ

1
@IterというURLを見つけた方法を正確に説明しました。誰でも今日のプロセスを繰り返し、見つけたページで答えを見つけることができます。
Rob Kennedy

回答:


179

はい、それは単なる@「糖衣」であり、声を出して「as」と読み上げます。ps@(p:pt)あなたに名前を付けます

  1. リスト: ps
  2. リストの先頭: p
  3. リストの末尾: pt

がない場合は@、(1)または(2):( 3)を選択する必要があります。

この構文は、実際にはどのコンストラクタでも機能します。を持っている場合はdata Tree a = Tree a [Tree a]t@(Tree _ kids)ツリーとその子の両方にアクセスできます。


3
この構文の名前を知っていますか?
ダンザ

7
「as-pattern」と呼ばれる
アダモ

41

@シンボルは、パラメータに名前を付け、次のパターンに対して、そのパラメータを一致させるの両方に使用されています@。これはリストに固有のものではなく、他のデータ構造でも使用できます。

これは、関数内のどこかでパラメーター全体を必要としながら、パラメーターをその部分に「分解」する場合に役立ちます。これが当てはまる1つの例はtails、標準ライブラリの関数です。

tails                   :: [a] -> [[a]]
tails []                =  [[]]
tails xxs@(_:xs)        =  xxs : tails xs

21

@すべてのレベルで機能することを追加したいと思います。つまり、これを行うことができます。

let a @ (b @ (Just c), Just d) = (Just 1, Just 2) in (a, b, c, d)

これはこれを生成します: ((Just 1, Just 2), Just 1, 1, 2)

つまり、基本的にはパターンを値にバインドする方法です。これは、上で示したように、リストだけでなく、あらゆる種類のパターンで機能することも意味します。これは、より多くのケースで使用できることを意味するため、知っておくと非常に便利です。

この場合、a全体でMaybe Tuplebちょうど最初にJustタプルであり、cそしてd値が第一及び第二の中に含まれているJustそれぞれのタプルに


9

他の人が言ったことに追加するために、それらはas-patterns(MLでは構文はキーワード「as」を使用します)と呼ば、Haskell Reportのパターンに関するセクションで説明されています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.