学習の記録−4
ボクシング
変数を無理やりvariant型に倒すイメージ。関数boxを使う。元の型での演算はできなくなる。応用例としては型調べる関数作るのに使うっぽい。型名を隠した操作をする時に活躍。
> let x = box 42;; val x : obj = 42 > unbox<int> x;; val it : int = 42 > x + 5;; x + 5;; ----^ C:\Documents and Settings\Administrator\Local Settings\Temp\stdin(55,5): error FS0001: The type 'int' does not match the type 'obj' > let isInt x = (box x) :? int;; val isInt : 'a -> bool > isInt 5;; val it : bool = true > isInt 5.5;; val it : bool = false
:?はパターンマッチにも使える
> let isInt x = match box x with | :? int -> Some x | _ -> None;; val isInt : 'a -> 'a option > isInt 5;; val it : int option = Some 5 > isInt 5.5;; val it : float option = None
同じ動作を以下のようにも書ける。Twitterで、私が教科書的に使用している
- 作者: 荒井省三:いげ太
- 出版社/メーカー: 技術評論社
- 発売日: 2011/01/07
- メディア: 大型本
- 購入: 6人 クリック: 264回
- この商品を含むブログ (26件) を見る
> let isInt x = box x |> function | :? int as x -> Some x | _ -> None;; val isInt : 'a -> int option > isInt 4;; val it : int option = Some 4 > isInt 4.0;; val it : int option = None