Open1

Gleamでのカリー化

MzRyuKaMzRyuKa

Gleamの関数をカリー化する場合、標準ライブラリに含まれるモジュール gleam/functionの関数curryN(Nは2-6までの値)を利用する。

https://hexdocs.pm/gleam_stdlib/gleam/function.html#curry2

ひとまず、curry2の利用方法を確認。

通常の関数

通常の関数
  let chikin_func = fn(x: Int, y: Float) -> Float { int.to_float(x) +. y }
  chikin_func(10, 20.5)
  |> string.inspect()
  |> io.println()

実行結果はこちら

30.5

カリー化(curry2)した関数

これをカリー化してみる。
引数が2個なので、上述の通り、curry2を利用してみる。

まず、gleam/functionが必要。

import gleam/function

その上で、関数をカリー化。

  let chikin_func = fn(x: Int, y: Float) -> Float { int.to_float(x) +. y }
  let chikin_curry = function.curry2(chikin_func)
  chikin_curry(10)(20.5)
  |> string.inspect()
  |> io.println()

実行結果はこちら

30.5

結果は同じ。

カリー化(curry2)した際に、引数を一つだけ入れている場合はどうなる

では、最初の引数だけに留めた場合、どうなるのか。

  let chikin_func = fn(x: Int, y: Float) -> Float { int.to_float(x) +. y }
  let chikin_curry = function.curry2(chikin_func)
  chikin_curry(10)
  |> string.inspect()
  |> io.println()

実行結果はこちら。

//fn(a) { ... }

ならば、一旦変数へバインドしてみる。

  let chikin_func = fn(x: Int, y: Float) -> Float { int.to_float(x) +. y }
  let chikin_curry = function.curry2(chikin_func)
  let chikin_curry_part1 = chikin_curry(10)

  // ここで、一旦出力
  chikin_curry_part1
  |> string.inspect()
  |> io.println()

  // ここで、2つ目引数に値を入れて、もう一回出力
  chikin_curry_part1(20.5)
  |> string.inspect()
  |> io.println()
//fn(a) { ... }
30.5