web-dev-qa-db-ja.com

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

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

ps@(p:pt)

@シンボルは、この文脈での意味ですか? Googleで情報を見つけることができないようです(残念ながらGoogleでシンボルを検索するのは難しいです)。また、Preludeのドキュメントで関数を見つけることができません。

114
mipadi

はい、それは単なる構文糖であり、_@_は「as」と読み上げられます。 ps@(p:pt)は次の名前を提供します

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

_@_がなければ、(1)または(2):( 3)を選択する必要があります。

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

162

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

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

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

それを追加したい@はすべてのレベルで機能します。つまり、次のことができます。

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

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

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

この場合、aは全体のMaybe Tuplebはタプルの最初のJustであり、cdは最初と2番目のJustそれぞれタプル内

19
Electric Coffee

他の人々が言っ​​たことに追加するために、彼らはas-patternsと呼ばれ(MLでは構文はキーワード「as」を使用します)、記述されています patterns に関するHaskellレポートのセクションで。

8
newacct