我们可以在 ocaml 中定义一个参数为 0 的函数吗?

Can we define a function with 0 argument in ocaml?

在其他语言中,我们可以有一个不带参数的函数。我们可以在 ocaml 中使用 0 参数函数吗?

而不是

let foo n = 55

你只是

let foo = 55

然后在任何地方调用 foo。

OCaml 中的函数只有一个参数(忽略由于可选参数引起的复杂性)。所以,你不能有一个没有参数的函数。

正如@alfa64 所说,您可以将简单值视为不带参数的函数。但它将始终具有相同的值(实际上,这使其类似于纯函数)。

如果您想编写一个实际上不需要任何参数的函数(可能有副作用),传统上使用 () 作为其参数:

# let p () = Printf.printf "hello, world\n";;
val p : unit -> unit = <fun>
# p ();;
hello, world
- : unit = ()
# 

在 OCaml 中,函数总是有一个参数。因此,我们可能想知道如何在 OCaml 中翻译以下 say_hello C 函数:

void
say_hello()
{
    printf("Hello, world!\n");
}

OCaml中有一种特殊的类型unit,它只有一个值,写成()。虽然它可能看起来奇怪且无用,但它为语言增加了规律性:不需要特定参数的函数可以只接受 unit 类型的参数,不返回有用值的函数通常 returns 一个值类型 unit。以下是如何将上述 say_hello 函数转换为 OCaml:

# let say_hello () = print_endline "Hello, world!";;
val say_hello : unit -> unit = <fun>

顺便说一下,如果没有类型 void 而是类似的 unit 类型,那么在 C++ 中基于模板的元编程会容易得多。在模板特化中单独处理没有参数的函数是很常见的。


对象方法虽然类似于函数,但不需要参数。

# class example =
object
  method a =
    print_endline "This demonstrates a call to method a of class example"
end;;
        class example : object method a : unit end
# let x = new example;;
val x : example = <obj>
# x # a ;;
This demonstrates a call to method a of class example
- : unit = ()