> For the complete documentation index, see [llms.txt](https://kurohasu.gitbook.io/fsharpabout/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kurohasu.gitbook.io/fsharpabout/advance/tapurutoopushon.md).

# タプルとオプション型

### タプル型

タプルは値をペアにしたものを指す型で構造体にすることができます\
F#上ではint\*floatのように表現されており、タプルの一つの要素を取り出す場合ワイルドカードを使用し抽出できます

```
構文:(属性1,属性2,...)
     struct(属性1,属性2,...)

取り出す:let (変数1,_)=(取り出す値,値)
```

```fsharp
//例:
//①intとfloatのタプル"twonum"
let twonum=(1.0,3.14f)

//②式と式のタプル"doscal"
let doscal=(a+10,b*10)

//③charとintの構造体"mixing"
let mixing=struct('C',78)
```

match文や関数に渡す場合は対応するタプルを見て判断する処理を記述すると処理が行われます\
逆に関数の戻り値がタプル型で、その値を各変数に格納したい場合は戻り値の順になるように変数の代入順番を変更します

```fsharp
let tup=(1,2) //int*intのタプル

//① match文でtupleなら2番目の値を出力する
match tup with 
    |(a,b)->printfn "second element is %d!" b
    //bに2が渡される
    
    
//②タプルの各値を＋３する関数
let plustwo((ad1,ad2):int*int)=
    (ad1+3,ad2+3)
    
printfn "%A" <|plustwo(tup)


//③2つの乱数を返す関数＆それを変数rnd1,rnd2に設定(let宣言)
let backrnd()=
    let back1=System.Random().Next()
    let back2=System.Random().Next()
    back1,back2

//呼び出し
let rnd1,rnd2=backrnd()    //rnd1<-back1,rnd2<-back2となる
```

{% hint style="info" %}
タプルの値を用いて変数を更新する場合①で紹介したようにmatch文を使用することが有効的かもしれません
{% endhint %}

### オプション型

変数をオプション型に指定することで値の有無を任意にすることができます\
値がある場合Some()、存在しない場合Noneとなります\
オプション型では値を得るvalue()とsome/noneを判断するIsSome()/IsNone()がサポートされています\
何かを探す関数(tryFindIndexなど)から返ってくる値がこの型です

```
構文:変数=Some(値)
    変数=Option.Some 値

値を得る:変数.Value()
```
