OCaml - 什么数据类型是一些,没有?

时间:2014-02-01 13:44:41

标签: types ocaml

如果我在列表中使用SomeNone组合,那么列表的数据类型是什么?总是'a吗?或者Some / None是否有某种类型?

let listVar : (* type here *) list = [Some 4; Some 3; None; Some 2];;

如果我放int它会给我错误:

  

此表达式的类型为int option * int option *'a option * int   选项,但在这里使用类型int

当我放'a它编译得很好但basic OCaml tutorial说(我提到了其他语言来更好地解释我的问题):

  

尚不清楚为什么多态函数是有用的,但它们   是非常有用和非常常见的,所以我们稍后会讨论它们。   (提示:多态性有点像C ++中的模板或泛型中的模板   Java 1.5)。

我认为这就像其他语言中的引用/指针一样,实际上是有道理的。但现在,我真的不明白什么类型None。与Some相同。

另外,我知道我应该在一个问题中提出两个问题,但这个问题与前一个问题有很强的关系。有些人有什么意义?我经常看到在使用None时使用它。如果我实现上面的列表没有Some,它仍然编译,但列表结构没有“选项”标志,我猜这意味着可选(我似乎无法在互联网上找到任何关于这个)。有人能为我提供一个有用的案例吗?

4 个答案:

答案 0 :(得分:9)

你在这里写的是(int option * int option * 'a option * int option) list类型的值,即前两个组件是可选整数的四元组列表,到目前为止下一个是多态的(有些情况尚未定义)和最后一个是可选的整数。这是因为,是元组分隔符。列表分隔符是;所以我想你想写

let listVar = [Some 4; Some 3; None; Some 2];;

哪个类型为(int option) list。只要您将SomeNone'a类型的任意值一起使用,您就会获得'a option类型的值。

答案 1 :(得分:2)

它是选项类型,表示它是否具有某种值。

如果您来自Java或C#或其他命令式编程,只要您想在Java方法中的Java方法中返回null,您应该考虑返回None

答案 2 :(得分:2)

Caml有预定义的`a option类型(`a表示它可以是任何选项,与`a list可以是int list的方式相同, float list ...)。它实际上是一种非常简单的类型:

type `a option = Some of `a | None

基本上,类型为`a option的值为None或类型为`a 的值放在方框中:它的类型与`a(这就是当您告诉编译器将其视为int时出现错误的原因)。

您应该将其视为处理错误的明确方式(比例外更明确)。考虑那些(非尾递归,写得不好)函数:

let rec max_exn l = 
  match l with
    | [] -> failwith "Empty list"
    | [x] -> x
    | x::tl -> max x (max_exn tl)

let rec max_option l = 
  match l with
    | [] -> None
    | [x] -> Some x
    | x::tl -> max x (max_option tl) (* max does work on options *)

第一个类型为`a list -> `a,这使得调用者可以忘记空列表情况。第二个类型为`a list -> `a option,这意味着错误情况将始终由调用者处理。

换句话说:None有点类似于null,除了你总能告诉函数的类型是否可以返回None(如果它可能,编译器强迫你处理它。)

答案 3 :(得分:0)

当我尝试从上面编译解决方案代码(@Jbeuh)时,我收到以下错误消息:

Error: This expression has type 'a but an expression was expected of type
         'a option
       The type variable 'a occurs inside 'a option

所以我决定提供另一种代码解决方案(可行):

let rec max_el = function
    | [] -> None
    | [x] -> Some x
    | x::xs -> let m = max_el xs in
                    if Some x > m then Some x 
                    else m