次のようなHaskellコードを見つけました。
ps@(p:pt)
@
シンボルは、この文脈での意味ですか? Googleで情報を見つけることができないようです(残念ながらGoogleでシンボルを検索するのは難しいです)。また、Preludeのドキュメントで関数を見つけることができません。
はい、それは単なる構文糖であり、_@
_は「as」と読み上げられます。 ps@(p:pt)
は次の名前を提供します
ps
p
pt
_@
_がなければ、(1)または(2):( 3)を選択する必要があります。
この構文は、実際にはどのコンストラクターでも機能します。 _data Tree a = Tree a [Tree a]
_がある場合、t@(Tree _ kids)
を使用すると、ツリーとその子の両方にアクセスできます。
@
シンボルは、パラメータに名前を付け、@
に続くパターンとそのパラメータを一致させるために使用されます。これはリストに固有のものではなく、他のデータ構造でも使用できます。
これは、関数内のどこかでパラメーターを全体として必要としながら、パラメーターをその部分に「分解」したい場合に便利です。この場合の1つの例は、標準ライブラリの tails
関数です。
tails :: [a] -> [[a]]
tails [] = [[]]
tails xxs@(_:xs) = xxs : tails xs
それを追加したい@
はすべてのレベルで機能します。つまり、次のことができます。
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 Tuple
、b
はタプルの最初のJust
であり、c
とd
は最初と2番目のJust
それぞれタプル内
他の人々が言ったことに追加するために、彼らはas-patternsと呼ばれ(MLでは構文はキーワード「as」を使用します)、記述されています patterns に関するHaskellレポートのセクションで。