如果我在列表中使用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
它编译得很好但basic OCaml tutorial说(我提到了其他语言来更好地解释我的问题):
尚不清楚为什么多态函数是有用的,但它们 是非常有用和非常常见的,所以我们稍后会讨论它们。 (提示:多态性有点像C ++中的模板或泛型中的模板 Java 1.5)。
我认为这就像其他语言中的引用/指针一样,实际上是有道理的。但现在,我真的不明白什么类型None
。与Some
相同。
另外,我知道我应该在一个问题中提出两个问题,但这个问题与前一个问题有很强的关系。有些人有什么意义?我经常看到在使用None时使用它。如果我实现上面的列表没有Some,它仍然编译,但列表结构没有“选项”标志,我猜这意味着可选(我似乎无法在互联网上找到任何关于这个)。有人能为我提供一个有用的案例吗?
答案 0 :(得分:9)
你在这里写的是(int option * int option * 'a option * int option) list
类型的值,即前两个组件是可选整数的四元组列表,到目前为止下一个是多态的(有些情况尚未定义)和最后一个是可选的整数。这是因为,
是元组分隔符。列表分隔符是;
所以我想你想写
let listVar = [Some 4; Some 3; None; Some 2];;
哪个类型为(int option) list
。只要您将Some
或None
与'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