使い方を教えてくださいパターンマッチングの"let'定義は?
-
19-08-2019 - |
質問
私は知F#で使えるようになったのでうチームリテラルやその他のパターンとして
let fib 0 = 1
let exists item [] = false
let car (hd :: tl) = hd
let cdr (hd :: tl) = tl
F#正しく解釈しこれらの機能のパターンマッチングが与えてくれるのは以下の警告:
警告1"不完全なパターンマッチ この表現です。例えば、 値に"1"ません マッチ
警告2つの不完全なパターンマッチ この表現です。例えば、 値'[_]'ません マッチ
など。
これらの機能として期待していきたいと思ってい関数を定義するグローバル-スタンダードに完全にパターンにマッチしかこの代替パターンマッチングの構文のF#ます。
私が使用できます let whatever = function ...
や let whatever x = match x with ...
結果が得られませんが欲しい、私はそういえばこっちだという文法パターンマッチングやかnagってもんだのに使用します。
どう書いていの機能を代替パターンマッチングの書式を示しますのでご注意ください。▼
解決
JaredParは、F#を持っていないので文書をウはこちらです。
F#formは、主に有を打破すべく開放シングルケースで差別の労働組合または関数を定義すると不完全一致(お車例にエラーが発生した場合は、空のリストにこの結果は実質的にすべての名称結合の言語で経由パターン;この文書定義関数を使用パターンの引数がないことが多いのにも役立つ実践のための正確な理由をご説明します。
と思いウったらいいなと思うことはたくさんよりMLでは統語的形態がF#'sルーツML.のは良いのサブセットF#クロス統と存(たブートストラップF#言語とユーザーコミュニティ);の欠点であるF#はこだわった"ですが、複数のビット突入/完全限定構文です。
他のヒント
AFAIKがF#を宣言するのに複数のみのバインディングと同じ名前と異なるパターンマッチングフェースの通称です。と思い、最寄りの構築にどをお探しの機能規則に発現する。
この例自動車
let car = function
| hd::tl -> hd
| [] -> failwith "empty list"
どうやら、F#'sパターンマッチングする方法により使用してい共通。
最初は、結合の数値です。通常、でという List.partition
:
let data = [7;0;0;0;1;0;1;1;1;1;0;0;1;1;0]
let ones, others = data |> List.partition ((=) 1) // bind two values
ており、結合する複数の識別子の値は同じ値:
let (a & b) = 42 // a = 42; b = 42
まずは簡単な let
結合のためのシンプルさが人気です。
let hd::tl = data
警告FS0025:不完全なパターンにマッチす。たとえば、value[]'を示している可能性があり、場合によって、パターン(s)です。
これを緩和するため、追加の別の場合は空の一覧:
let (hd::tl) | [] = data
エラー FS0018:双方は、この"または"パターンを結合する異なる変数
ことになるtrue;の場合は空のリスト hd
や tl
残ジ.で結合する tl
同じ空のリスト:
let (hd::tl) | ([] as tl) = data
しかし、このエラー エラー FS0018 行できません。実際、またを提供する一部のデフォルト値 hd
.
以下の汚れtrickますか?
let (hd::tl, _) | ([] as tl , hd) = data, 42
その線上のbind hd
の data
ヘッドには、場合のリストが空なら、ファイル または のサーバパラメータのチューニングの第二の価値 tuple
.
注意 私が見つからなかった場合の組み込み 42
の let
施工性が向上します。
最後に、同じ car
機能:
let car ((hd::tl, _) | ([] as tl, hd)) = hd
let foo = car(data, 42) // foo = 7
let bar = car([], 42) // bar = 42
どう書いていの機能を代替パターンマッチングの書式を示しますのでご注意ください。▼
まった場合のみパターンを余す明らかな例があり、これが有用などのタプル、と記録のシングルケースの労働組合は、活動パターン
この言語の特徴につい:
let f(a, b) = ...
このgeneralizes:
let f(a, (b, c)) = ...
も利用できますことを選択デフォルトの値は Some value
:
let def(x, None | _, Some x) = x
ちなみに、スタイルのご提案で使用されたSML前にウおよびSMLはMLことを明らかになウvs ML.私は実際に希望は存/F#styleでは繰り返す:
fun descriptiveFunctionName [] = true
fun descriptiveFunctionName (_::_) = false
vs
let descriptiveFunctionName = function
| [] -> true
| _::_ -> false
これは非学術コードが実質価値は自己記録識別子のことです。