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

"let ()" は何も返さないようです。

心から!

4

2 に答える 2

24

let次の構文のように、新しい変数を定義するために使用されるキーワードです。

let pattern = expr

例えば

let a = 2

2nameに値を割り当てますa。(これは既存の変数に値を代入する方法ではありませんが、これは別のトピックであることに注意してください)。

しかし、標識の左側のパターン=は単なる名前以上のものです。例えば

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

aと の両方をbそれぞれ42とと定義し"foo"ます。もちろん、両側の型が一致している必要があります。ここではどちらが当てはまりますか: 両側は typeint * stringです。

記号の右側の式=も詳しく説明できます。たとえば、

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

fooはstring として定義します"aabaaaaaaa"temp(補足として、がこのコード スニペットに対してローカルであることも保証します)。

では、両方を使用してみましょう: 左側は type の値に一致するパターンunit、右側は type の式unitです。

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

これは構造を説明していますlet () =。については、パターンでワイルドカードとして使用できることlet _を知っておく必要が_あります。これは、任意のタイプの値に一致し、名前をバインドしません。例えば

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

として定義a42、値を破棄します"foo"_「私はここに何かがあることを知っており、私はそれを使用しないと明確に言っているので、名前を付けません」という意味です。here_は type の値と一致させるために使用されましたが、次stringのような任意の型の値と一致させることができますint * string:

let _ = (42,"foo")

これは変数を定義しておらず、あまり役に立ちません。このような構文は、右辺に次のような副作用がある場合に役立ちます。

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

これは、質問の2番目の部分を説明しています。



実用的な目的

どちらも使用されますが、どちらを使用するかは好みの問題です。

let () =右側が 型であることをコンパイラがチェックするため、少し安全unitです。unit 以外の型の値は、多くの場合バグです。

let _ =少し短いです(この議論を見たことがあります)。(括弧を自動的に閉じるエディターでは、キーストロークの数は同じであることに注意してください;-)

于 2012-07-17T07:27:00.720 に答える
2

私はOCamlの専門家ではありませんが、何かを共有させてください:)

letOCamlのは 2 つのことを表すことができます。

  1. 変数を割り当てる方法。
  2. 関数を宣言したり、関数を名前に割り当てたりする方法。

例を使用すると、それがどのように機能するかを明確に理解できます: 変数の割り当て:

# 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 _= の違いは次のとおりです。

最初の例では、ユニットを出力する必要がある名前、パラメーター、および命令を持たない関数を宣言しています。2 番目の例では、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 = ()
于 2012-07-17T03:31:34.163 に答える