今日F#について読んでいて、1つのことがはっきりしていません:
から: http://msdn.microsoft.com/en-us/library/dd233200.aspx
タプルの要素が 1 つだけ必要な場合は、ワイルドカード文字 (アンダースコア) を使用して、必要のない変数の新しい名前を作成しないようにすることができます。
let (a, _) = (1, 2)
こんな状況になったのはいつだったか思い出せない。変数名の作成を避けるのはなぜですか?
今日F#について読んでいて、1つのことがはっきりしていません:
から: http://msdn.microsoft.com/en-us/library/dd233200.aspx
タプルの要素が 1 つだけ必要な場合は、ワイルドカード文字 (アンダースコア) を使用して、必要のない変数の新しい名前を作成しないようにすることができます。
let (a, _) = (1, 2)
こんな状況になったのはいつだったか思い出せない。変数名の作成を避けるのはなぜですか?
値は必要ないからです。私はこれをよく使います。値が使用されていないという事実を文書化し、名前付け変数を保存しますunused
、dummy
など。私に言わせれば素晴らしい機能です。
興味深い質問です。ここには多くのトレードオフが関係しています。
あなたの比較は Ruby プログラミング言語で行われたので、おそらく最初に考慮すべきトレードオフは静的型付けです。このパターンを使用するとx, _, _
、F# は、ちょうど 3 つの要素からなるトリプルの最初の要素を参照していることを認識し、コンパイル時にこの制約を適用します。ルビーはできません。F# は、パターンの網羅性と冗長性もチェックします。繰り返しますが、Ruby はできません。
比較もフラット パターンのみを使用しています。パターン_, (x, _)
などを検討してx, None | _, Some x
ください[] | [_]
。これらはそう簡単には翻訳できません。
#1
最後に、Standard ML は F# に関連するプログラミング言語であり、任意の数の要素を持つタプルの最初の要素を抽出するために etc.と呼ばれる演算子を提供することを言及しておきます (こちらを参照)。前に。これは、SML の#n
表記法が、型システムの制約内で理解できないエラー メッセージで最高潮に達したためだと思います。たとえば、を使用する関数#n
は、タプルのアリティが何であるかを明確にしていませんが、タプルのアリティに対して関数をジェネリックにすることはできないため、より多くの型情報を提供する必要があることを示すエラー メッセージが表示されますが、多くのユーザーはそれが混乱していると感じています。CAML/OCaml/F# アプローチでは、そのような混乱はありません。
let
あなたが与えた-binding は、タプルだけでなく、多くの型を分解するために使用できるpattern matchingと呼ばれる言語機能の例です。パターン マッチでは、アンダースコアは、値を参照しないことを表す慣用的な方法です。
タプルの要素に直接アクセスすると、より簡潔になりますが、一般的ではありません。パターン マッチングを使用すると、一部のデータの構造を調べて、適切な処理ケースにディスパッチできます。
match x with
| (x, _, 20) -> x
| (_, y, _) -> y
このパターン マッチはx
、3 番目の要素が の場合にのみ、最初のアイテムを返し20
ます。それ以外の場合は、2 番目の要素を返します。些細なケースを超えると、アンダースコアは重要な読みやすさの助けになります。上記を次のものと比較します。
match x with
| (x, y, 20) -> x
| (x, y, z) -> y
最初のコード サンプルでは、パターン内で関心のあるバインディングを簡単に判断できます。
メソッドが複数の値を返す場合がありますが、記述しているコードはそれらの選択された少数 (または 1 つ) にのみ関心があります。複数のアンダースコアを使用して、必要のない値を本質的に無視することができます。ローカル スコープにたくさんの変数がぶら下がっているのではありません。