Types OCaml-什么数据类型是“有”和“无”?

Types OCaml-什么数据类型是“有”和“无”?,types,ocaml,Types,Ocaml,如果在列表中使用Some和None组合,那么列表的数据类型是什么?它总是'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放进去时,它编译得很好,但是上面说(为了更好地解释我的问题,我参考了其他语

如果在列表中使用
Some
None
组合,那么列表的数据类型是什么?它总是
'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
放进去时,它编译得很好,但是上面说(为了更好地解释我的问题,我参考了其他语言):

多态函数为什么有用还不清楚,但它们 非常有用并且非常常见,因此我们将在后面讨论它们。 <>强:(多态)类似于C++中的模板或泛型 Java 1.5)。

我认为这就像其他语言中的引用/指针一样,实际上是有意义的。但是现在,我真的不明白什么类型是
None
有些也一样


另外,我知道我应该在一个问题中问两个问题,但这一个问题与前一个问题有很大关系。有什么意义?我通常看到它在没有使用的情况下被使用。如果我实现上面的列表时没有一些,它仍然可以编译,但是列表结构没有“option”标志,我猜这意味着可选的(我在互联网上找不到任何与此相关的内容)。有人能给我一个有用的例子吗?

你在这里写的是一个类型为
(int option*int option*'a option*int option)的值列表
,也就是说,一个由四个部分组成的列表,其中前两个部分是可选的整数,下一个到目前为止是多态的(某些情况尚未定义)最后一个是可选的整数。这是因为
是元组分隔符。列表分隔符为
所以我猜你想写

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

其中包含类型
(int选项)列表
。无论何时将
Some
None
与类型为
'a
的任意值一起使用,您都会得到类型为
'a option

的值,它是选项类型,指示它是否具有某些值


如果您来自java或C语言或其他命令式编程,每当您想在java方法中返回一个<代码> null <代码>,在OcAML中,您应该考虑返回一个<代码>没有< //> > /p> < p> CAML有一个预定义的<代码>选项:(a

表示它可以是任何选项,就像a
`a list
可以是
int list
、a
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
(如果可能,编译器会强迫你处理它)。

当我试图从上面编译解决方案代码(@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