学習の記録−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で、私が教科書的に使用している

実践 F# 関数型プログラミング入門

実践 F# 関数型プログラミング入門

の著者の方に教えてもらった。ありがとうございます。

> 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