ものとしての関数
そのため、他の関数の入力として渡せる
https://scrapbox.io/files/66a34ee073371d001c17848f.png
出力として返すことも可能
https://scrapbox.io/files/66a34efca98ee0001df48771.png
関数のパラメータとして渡すことで、その動作を制御できる
https://scrapbox.io/files/66a34f3deb9a0c001c4d86e6.png
F# で関数を「もの」として扱う
通常の関数定義
code:fsharp
let plus3 x = x + 3
let times2 x = x * 2
code:fsharp
let square = (fun x -> x * x)
関数を変数に束縛する
code:fshap
let addThree = plus3
リストにまとめる
code:fsharp
ループして、各関数を順番に評価できる
code:fsharp
for fn in listOfFunctions do
let result = fn 100
printfn "If 100 is the input, the output is %i" result
入力としての関数
入力として関数を受け取る関数を考える
code:fsharp
// val evalWith5WithAdd2: fn: (int -> int) -> int
let evalWith5WithAdd2 fn =
fn(5) + 2
動作を確認する
int -> int の任意の関数を受け取れる
code:fsharp
let add1 x = x + 1
evalWith5WithAdd2 add1 // val it: int = 8
code:fsharp
let square x = x * x
evalWith5WithAdd2 square // val it: int = 27
出力としての関数
なぜ関数を返すのか?
関数に特定のパラメータを組み込める
e.g. 加算器ジェネレータ
code:fsharp
// val adderGenerator: numberToAdd: int -> x: int -> int
let adderGenerator numberToAdd =
fun x -> numberToAdd + x
入力として int を受け取り、int -> int 関数を返す
無名関数ではなく名前付き関数を使うことも
code:fsharp
let adderGenerator numberToAdd =
let innerFn x =
numberToAdd + x
innerFn
動作確認
code:fsharp
let add1 = adderGenerator 1 // val add1: (int -> int)
add1 2 // val it: int = 3
let add100 = adderGenerator 100 //val add100: (int -> int)
add100 2 // val it: int = 102
関数を返すことが可能だと、多パラメータの関数を 1 パラメータの関数が連なったものに変換できる。
関数が カリー化 されていれば、多パラメータの関数に 1 つだけ引数を渡すと、最初のパラメータ以外のパラメータを受け取る新しい関数を返す。 code:fsharp
let sayGreeting greeting name =
printfn "%s %s" greeting name
let sayHello = sayGreeting "Hello"
let sayGoodbye = sayGreeting "Goodye"
sayHello "Alex"
sayGoodbye "Alex"