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"
これにより、以下が順番に出力されます