2015-12-19 7 views
5

は、あなたがこのようなタイプがあると判別しますタプルの最初の要素の値を得ることが可能です。は組合

fst corner 

何らかのアンラップのように見えますint*intにpingする必要があります。

答えて

5

私はそれがあることを意味したと仮定し

type Corner = Corner of int*int 

その場合には、これが最初の値を取得します:

let (Corner(first,_)) = corner 
+0

ありがとう、私はタイプの型を意味しました:)しかし、この割り当ては、タプルのメンバーを使用するために一時変数を必要とすることを意味します(最初に参照するよりも作成します) –

6

@Fooleが提供する答えは良いですが、コメントIから一時変数firstを '宣言'する必要がないという印象を受けます。あなたがしたいのは、最初の値を引き出し、それを別の関数にパイプすることだけです。

これを自動的に行うことができることを私が認識している組み込み機能はありません。上記のCornerタイプがDiscriminated Union(DU)の縮退ケースであると考えてください。通常、DUはより多くの症例を有し、それらはしばしば形状が不均一である。

Cornerのような単一のケースのDUを持つのがよい理由はありますが、そのタイプをよりスムーズにするためのさまざまな「ヘルパー」機能も提供することがよくあります。 、私は、CornerモデルはA座標と仮定してきました。ここ

let cornerX (Corner(x, _)) = x 

let cornerY (Corner(_, y)) = y 

しかし、あなたがしたい場合は、名前を付けることができます:Cornerタイプの場合

、次のような機能を定義することができます機能fstおよびsnd。あなたはそれをむしろ好むならば、それらを専用のモジュールに入れることもできます。

これは一時的な変数の手間をかけずにCorner値から値を抽出し、配管することができるようになります:cornerはOPのように定義されて

> corner |> cornerX |> ((*) 10) |> string;; 
val it : string = "10" 

+0

任意の2タプル/ nタプルの単一ケースの識別されたユニオンの汎用バージョン? – mbx

+1

@mbx実際に何が起こっているのかは、ケースコンストラクタのパターンマッチングなので、私はそうは思わない。パターンマッチングでは、ケースコンストラクタの名前が重要です。実際には関数です。しかし、 'let'-bound関数を宣言する必要がない、簡潔なインライン選択肢のための@TheQuickBrownFoxの答えを見てください。 –

3

既に述べたように、名前を付けずに最初に識別されたユニオンケースを取得することはできません。しかし、ここでそれを行うには、非常に簡潔な方法です:

Corner (1,1) |> function Corner (x,_) -> x 

これは一つのパラメータを持つ関数を作成し、そのパラメータにストレートパターンマッチにジャンプfunctionキーワードを使用しています。一致するケースは1つしかないので、1つの行にきれいに収まります。