我们可以在 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 = ()
在其他语言中,我们可以有一个不带参数的函数。我们可以在 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 = ()