F#入门-第二章 F#基础-第十九节 option类型

    option类型是F#中的便捷类型之一。使用option类型,可以表示“不存在值,存在某个值“。
    option类型的简单定义如下所示(根据Expert F# p37)

option类型
type 'a option =
  | None //不存在值
  | Some of 'a //存在值

 
    下例中举例说明option类型的值。

option类型的值
> Some 3;;
val it : int opt = Some 3
> Some "hello";;
val it : string opt = Some "hello"
> None;;
val it : 'a opt = None


    option类型在执行有可能失败的操作,例如寻找元素时使用。
    事实上,对于F#的列表,存在着tryfind函数,该函数使用option类型将寻找到的结果返回.

tryfind示例
> List.tryfind ((=)1) [2;3;4];;
val it : int option = None
> List.tryfind ((=)2) [2;3;4];;
val it : int option = Some 2


    这段代码中对于[2;3;4]这个列表调查1或2存不存在.

    在第一个例子中,因为没有寻找到数据,所以返回None类型的数据.
    同时,请注意None类型不是'a option,而是int option.
    另外,对于列表来说,还存在着不使用option类型,而是有可能抛出异常的方法List.find.

    使用匹配模式来对option类型的数据进行操作.下面的示例中接受int option类型的值,如果接受到的值存在,就将该值加一,然后返回int option类型。

option类型的操作
let add1 a =
    match a with
        | None -> None
        | Some(x) -> Some(x+1);;
print_any (add1 (Some 2));;
print_any (add1 None);;
//Some 2 |> add1 |> print_any;;
//None |> add1 |> print_any;;


    但是,F#中关于option类型的基本操作,专门定义了Option模块。对于上例中的add1可以做如下定义。

option模块的利用
let add1 a = Option.map ((+)1) a;;


    Option.map和List.map和Array.map的基本使用方法是相同的,将Some(a)这种值更改为Some(f a),然后返回。同时,对于None仍然返回None。

    其他的基本函数有
        判断是不是Some类型的is_some
        判断是不是None类型的is_none
        如果是Some型则将该值返回的get
    等等。

option模块的利用2
let s = Some 1;;
let n = None;;

Option.is_some s;; //true
Option.is_some n;; //false
Option.is_none s;; //false
Option.is_none n;; //true
Option.get s;; //1
//Option.get n;; //Error
posted @ 2010-10-13 12:10  至尊无上  阅读(673)  评论(0)    收藏  举报