erlang 第5回 fun, 高階関数

少しテンパっていたので、お勉強も滞っていました。
今回から、第何回なのかを書いてみました。
というわけで、第5回です。

fun

  • 無名関数

さっそく簡単に書いてみる

1> TAX = fun(X) -> 1.05 * X end.
#Fun
2> TAX(1000).
1050.0
3> TAX(10, 30).
 ** exception error: interpreted function with arity 1 called with two arguments
  • 今の消費税を計算する関数
  • funはendで終わる
  • 引数の数を間違えるとエラーになる
  • funを返す関数や引数に取る関数の事を高階関数と呼ぶ

ここが肝らしい

funを引数に持つ

4> List = [100, 98, 298].
[100,98,298]
5> lists:map(TAX, List).
[105.0,102.9,312.90000000000003]
  • よく使うらしい標準ライブラリのlists:map
  • 他にはlists:filter等をよく使うらしい
    • lists:filter(fun, list)とした時
      • listの要素でfunを処理し、trueになるもののリストを返す

しかし、5行目の子。そうだよね。普段、数値演算系のプログラム組んでないから忘れかけてた(汗
精度(でしたよね?)には注意しましょう。
1.05を2進数で表現するには、ビットが無限に必要で、仕方なくある程度で丸めて、それに掛け算をした結果、桁があふれて・・・的なのだったハズです。(間違っている場合は、ご指摘ヨロシクです。話がそれるので、詳しく知りたい場合はggr)
1.5にしておけば・・・いやいやそんな消費税嫌。

funを返す関数

  • デバッグが難しくなりやすいため、一般的には使われるケースが低めらしい
1> Gkbr = fun(Tax) -> (fun(X) -> Tax * X end) end.
#Fun
2> Now = Gkbr(1.05).
#Fun
3> Future = Gkbr(1.5).
#Fun
4> Now(100).
105.0
5> Future(100).
150.0
  • 消費税を気軽に変更する処理

泣けるなぁ・・・。


spawnとか使いたいなぁ・・・。
冷静に振り返ると桁落ちだらけだな。