私は最近 F# の学習を開始し、次のような単純な例のカリー化された関数に出くわしました。
p
価格に販売個数を掛けて売上を計算する関数を考えてみましょうn
。
let sales (p,n) = p * (float n);;
この関数の型は次のように与えられます
val sales : p:float * n:int -> float
つまり、float
andのペアを取り、 aint
を返しますfloat
。
代わりに、これをカリー化された関数として書くことができます
let salesHi p n = p * (float n);;
この関数の型は次のように与えられます
val salesHi : p:float -> n:int -> float
つまり、 を取り、toの関数をfloat
返します。int
float
単純なケースでは、これは違いがないようです
sales (0.99, 100);;
salesHi 0.99 100;;
どちらも与える
val it : float = 99.0
ただし、カリー化された関数を使用すると、特定のアイテムの価格をフィードして新しい関数を取得できます。例えば
let salesBeer = salesHi 5.99;;
let salesWine = salesHi 14.99;;
次に、salesBeer 2
与え11.98
てsalesWine 2
与え29.98
ます。
+
また、 などの組み込み演算子が関数として定義されていることに気付きました。たとえば、次のように記述できます。
let plus2 = (+) 2;
List.map plus2 [1;3;-1];;
そして得る
val it : int list = [3; 5; 1]
これは良いことのようです。したがって、引数を取る命令型言語で関数を実装したい場合n > 1
、たとえば F# では常にカリー化された関数を使用する必要があります (引数が独立している限り)。または、必要に応じて、単純なルートを取り、n
後でタプルとカレーを使用して通常の関数を使用する必要がありますか? または、他の何か?
F# プログラマーは、カリー化された形式で関数を作成するか、タプルで通常の関数を使用するかをどのように決定しますか?