let () = Random.self_init();;
let _ = Random.self_init ();;
│- : unit = ()
"let ()" は何も返さないようです。
心から!
let () = Random.self_init();;
let _ = Random.self_init ();;
│- : unit = ()
"let ()" は何も返さないようです。
心から!
let
次の構文のように、新しい変数を定義するために使用されるキーワードです。
let pattern = expr
例えば
let a = 2
2
nameに値を割り当てます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")
として定義a
し42
、値を破棄します"foo"
。_
「私はここに何かがあることを知っており、私はそれを使用しないと明確に言っているので、名前を付けません」という意味です。here_
は type の値と一致させるために使用されましたが、次string
のような任意の型の値と一致させることができますint * string
:
let _ = (42,"foo")
これは変数を定義しておらず、あまり役に立ちません。このような構文は、右辺に次のような副作用がある場合に役立ちます。
let _ = Printf.printf "Hello world!\n"
これは、質問の2番目の部分を説明しています。
実用的な目的
どちらも使用されますが、どちらを使用するかは好みの問題です。
let () =
右側が 型であることをコンパイラがチェックするため、少し安全unit
です。unit 以外の型の値は、多くの場合バグです。
let _ =
少し短いです(この議論を見たことがあります)。(括弧を自動的に閉じるエディターでは、キーストロークの数は同じであることに注意してください;-)
私はOCamlの専門家ではありませんが、何かを共有させてください:)
let
OCamlのは 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 = ()