如何在Ocaml中表示浮点类型的空值?

5

我知道这可能看起来非常基础,但基本上,我想在模式匹配中说

match value with
  Null-> failwith "Empty"
 |value-> #do something

我尝试了任何的 null 或 none 的变化,也尝试过 unit,但由于值是浮点数,因此无法使用。

我感到困惑,希望能得到任何帮助。


3
没有空值。有一个选项类型,可以是某种类型的一些值。你是通过一些教程来学习Ocaml吗? - user395760
1
如果你想要捕获NAN/INF或次正常值,那么你可能会对Pervasives.classify_float感兴趣。 - nlucaroni
2个回答

11

你不能这样做。这是一种设计选择。许多编程语言允许任何值为null。这种方法的问题在于,当程序员意料之外地获得null值时,或者代码必须检查每个输入值是否为null时,就会变得混乱不堪。

OCaml采用的方法是,如果一个值可以为null,那么必须显式地标记它。这是使用option类型完成的:

match value with
  | None -> failwith "Empty"
  | Some value -> (* do something *)

然而,如果你直接在程序中使用它作为替换,那么编译将会失败,因为OCaml会发现"value"实际上不能为null。无论什么时候创建这个值都需要更新,以指示返回一个"null"值(None):

let safe_divide numerator denominator =
  if denominator <> 0. then
    Some (numerator /. denominator)
  else
    None (* division by zero *)

2
许多编程语言允许引用为空,但很少(如果有的话)允许为空(当然,除非使用像optionNullable这样的包装器)。 - user395760
null引用被其发明者称为“价值数十亿美元的错误”。 - Gilles 'SO- stop being evil'

2

正如delnan所说,OCaml中没有null。如果适用于您的问题,您可以使用类似于以下模式匹配中的选项:

let your_function x = 
   match x with
    | None -> failwith "Empty"
    | Some f -> #do something

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接