“let()=”和“let _ =”之间的区别是什么?

时间:2012-07-17 02:25:29

标签: ocaml

let () = Random.self_init();;
let _ = Random.self_init ();;
│- : unit = ()

看来“let()”什么都不返回?

此致!

2 个答案:

答案 0 :(得分:20)

let是用于定义新变量的关键字,如以下构造中所示:

let pattern = expr

例如

let a = 2

将值2分配给名称a。 (注意,这不是为现有变量赋值的方法,但这是另一个主题。)

=符号左侧的模式可能不仅仅是一个名称。例如

let (a,b) = (42,"foo")

ab定义为42"foo"。 当然,双方的类型必须匹配。 这是这种情况:双方都是int * string类型。

=符号右侧的表达式也可以详细说明,例如

let foo =
  let temp = String.make 10 'a' in
  temp.[2] <- 'b';
  temp

foo定义为字符串"aabaaaaaaa"。 (作为旁注,它还确保temp是此代码段的本地代码。)

现在,让我们使用两个:左边是模式匹配unit类型的值,右边是unit类型的表达式:

let () = Printf.printf "Hello world!\n"

其中解释了let () =构造。 现在,关于let _,只需要知道_可以在模式中用作通配符:它匹配任何类型的值并且不绑定任何名称。例如

let (a,_) = (42,"foo")

a定义为42,并丢弃值"foo"_表示“我知道这里有一些东西,我明确地说我不会使用它,所以我没有说出来”。此处_用于匹配string类型的值,但它可以匹配任何类型的值,例如int * string

let _ = (42,"foo")

没有定义任何变量,也不是很有用。当右侧有副作用时,这样的结构很有用,如下所示:

let _ = Printf.printf "Hello world!\n"

解释了问题的第二部分。



实用目的

两者都被使用,无论是使用其中一种,都是一种品味问题。

let () =稍微安全一些,因为它让编译器检查右侧是unit类型。 除单位以外的任何其他类型的值通常都是错误。

let _ =略短(我见过这个论点)。 (请注意,使用自动关闭括号的编辑器,击键次数相同; - )

答案 1 :(得分:2)

我不是OCaml专家,虽然让我分享一些内容:)

OCaml中的let代表两件事:

  1. 您可以分配变量的方式;
  2. 您可以声明函数或为函数指定函数的方式;
  3. 使用示例,您可以清楚地看到它是如何工作的: 分配变量:

    # let ten = 10;;
    val ten : int = 10
    
    # let hello_world_string = "Hello World";;
    val hello_world_string : string = "Hello World"
    

    声明功能:

    # let sum a b = a+b;;
    val sum : int -> int -> int = <fun>
    # sum 2 3;;
    - : int = 5
    

    所以,回答问题,let()=和let _ =之间的区别是:

    在第一个示例中,您声明的函数没有名称,参数或应输出单位的指令。第二个例子,你没有分配给_,即OCaml的通配符,任何值。

    正如我们在下面看到的,我们可以定义一个函数,它将立即执行,因为我们将无法再调用它:

    # let () = print_string "Hello";;
    Hello
    

    或者为OCaml的通配符分配类型和值,或者函数:

    # let _ = 10;;
    - : int = 10
    # let _ = print_string "Maybe I answered your question :) ";;
    Maybe I answered your question :) - : unit = ()