私はF#の学習を始めました。F#。タプルかどうか
関数の引数がタプルかどうかをどのように判断できますか?
let tuple = (1, 2)
let notTuple = 3
let isTuple t = // returns 'true' if t is a tuple, 'false' otherwise
printfn "%b" isTuple tuple // true
printfn "%b" isTuple notTuple // false
私はF#の学習を始めました。F#。タプルかどうか
関数の引数がタプルかどうかをどのように判断できますか?
let tuple = (1, 2)
let notTuple = 3
let isTuple t = // returns 'true' if t is a tuple, 'false' otherwise
printfn "%b" isTuple tuple // true
printfn "%b" isTuple notTuple // false
let isTuple value =
match box value with
| null -> false
| _ -> FSharpType.IsTuple(value.GetType())
CLRは実行時の型チェックをサポートしているので、技術的にはおそらくこれを行う方法があります。しかし、は、それを行うにはしないでください。このようなチェックが必要な場合は、アルゴリズムやデータ構造の設計がプログラミング言語にあまり適していないことを示します。これは、MLファミリの多態性哲学に反するものです。 (例外は、この考え方に従わない既存の.netライブラリとのインタフェースが必要な場合です)。
は具体的には、パラメトリック多型は、あなたがすでにそれがあるどのタイプか分からない何かを持っている時はいつでもあなたが見るために、データの中を見同一のではなく、すべてを扱いたいのでは、それがあるという概念に基づいていますそれは何ですか。この規則に従わないと、プログラミング言語の穀粒に反することになります。コードでは、関数がデータをどのように扱うかについての通常の情報が渡されないため、コードを理解しにくくなります。
タプルまたは単一の数値のいずれかを渡すことができるコードを作成し、そのコードに違いを認識させる場合は、バリアントタイプを明示的に定義する必要がありますパターンマッチングを使用し、呼び出し元にそのような選択肢を提供する関数の型を明示的に示します。