F#を学び始めたばかりです。この本では、次の表記法を使用しています。
let name() = 3
name()
これと何が違うのか:
let name = 3
name
?
F#を学び始めたばかりです。この本では、次の表記法を使用しています。
let name() = 3
name()
これと何が違うのか:
let name = 3
name
?
()関数呼び出しの構文などとは絶対に考えないでください。3、5、'q'、false、または "blah" などの単なる値です。それはたまたま type の値でUnitあり、実際にはそれが unit 型 の唯一の値ですが、実際にはそれは的外れです。()ここにあるのは単なる値です。私はそれを十分に強調することはできません。
最初に検討する
let name x = 3
これは何ですか?これは、x の関数を定義するだけです。ここで、x は任意の型にすることができます。C# では次のようになります。
int Name<T>(T x)
{
return 3;
}
ここで見てみるとlet name () = 3(余分なスペースをそこに置くことをお勧めします。そのため、()構文構造よりも価値があるように見えます)、C# では (疑似コード) のようなものと考えることができます。
int Name<T>(T x) where T == Unit //since "()" is the only possible value of Unit
{
return 3;
}
または、もっと簡単に
int Name(Unit x)
{
return 3;
}
上記の C# バージョンと同様に、すべてlet name () = 3が引数を取り、3 を返す関数の定義であることがわかります。Unit
ただし、C#let name = 3の場合と同様に、これは単なる変数定義です。var name = 3
の
let name() = 3
name()
nameタイプの関数unit -> intです。
の
let name = 3
name
nameタイプの整数intです。
F# では、すべての関数に入力型と出力型があります。の入力タイプはlet name() = 3でunit、値は 1 つだけです()。その出力タイプはintで、値は から–2,147,483,648まで2,147,483,647です。別の例として、 typeboolには と の 2 つの値しかありませtrueんfalse。
では、 の使用法についての質問に戻ります()。関数の入力値を指定しないと実行できません。そのため、関数let name()=3を実行するには入力値を指定する必要があり、その入力タイプがunitであるため、使用できる唯一の値は です()。
name 関数を定義する別の方法を次に示します。
let name : (unit -> int) = (fun _ -> 3);;
これを次と比較します。
let name : int = 3
Usingは、単純な整数である 2 番目のケースではなく、()type のパラメーターを取る関数を作成します。unit
これは、関数の実行を制御する場合に特に重要です。
主な違いは、
let name() =
printfn "hello"
1
対
let name =
printfn "hello"
1
それから
let t = name + name
「こんにちは」を一度出力します。しかし
let t = (name()) + (name())
「こんにちは」を2回出力します。
関数が評価される順序を考慮するときは、これに注意する必要があります。
次のプログラムを検討してください。
let intversion =
printfn "creating integer constant"
1
printfn "integer created"
let funcversion() =
printfn "executing function"
1
printfn "function created"
let a = intversion + intversion
printfn "integer calculation done"
let b = (funcversion()) + (funcveriosn())
printfn "function calculation done"
これにより、以下が順番に出力されます