0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OCamlの組(tuple)とパターンマッチ

Last updated at Posted at 2020-01-29

初心者がわかったことを書いていきます。
環境
macOS Mojave 10.14.6
Ocaml 4.08.1

###組(tuple)

値を順序をつけて並べたもの。

    (* 3つの文字列をもつ tuple *)
    ("a", "b","c")

値の型は揃ってなくてもよいし、ネストしてもよい。

    (* 違う型の値をもつ tuple *)
    ("a", 12345, 1.34, true)
    
    (* tuple を要素のひとつとする tuple *)
    (("a", "b", "c"), 1, 2, 3)

もちろん変数に束縛できる。

    let tuple = (1, 2, 3)

パターンマッチ

パターンマッチを使って tuple から値を取り出す。 Ruby で見たことある感じですね。

    (* 2つの tuple を持つ tuple を定義 *)
    let tpl = (("a", 1), ("Hello", 12.3, true)) 
    val tpl : (string * int) * (string * float * bool) = (("a", 1), ("Hello", 12.3, true)) *)
    
    (* 2つの tuple をそれぞれ別の変数に取り出す *)
    let (tuple1, tuple2) = tpl (* (tuple1, tuple2) がパターン *)
    tuple1 : string * int = ("a", 1)
    tuple2 : string * float * bool = ("Hello", 12.3, true)
    
    (* tuple のすべての要素を分解して変数に取り出す *)
    let ((str1, int1), (string2, float1, bool1)) = tpl
    str1 : string = "a"
    int1 : int = 1
    string2 : string = "Hello"
    float1 : float = 12.3
    bool1 : bool = true

パターンマッチを使って一部の要素を取り出したい。

    let tpl = ("a", 1, 3.14)
    
    (* "a" と 1 だけほしい 3.14はいらない *)
    
    (* 悪い例: いらない要素を省略している *)
    let (str1, int1) = tpl
    # let (str1,int1) = tpl;;
    Error: This expression has type string * int * float
           but an expression was expected of type 'a * 'b
    (* (string型, int型, float型)の tuple が必要なところに('a, 'b)のtupleが与えられたというようなエラーメッセージ *)
    
    (* よい例: いらない要素に "_" (ワイルドカードパターン)を入れる *)
    let(str1, int1, _) = tuple
    str1 : string = "a"
    int1 : int = 1

間違ってたら優しく指摘してください

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?