見出し画像

OCamlでプログラミングを学んでいます(関数と再帰関数)

 「表現力と安全にこだわった仕事で使える関数型言語」OCamlによるプログラミング学習の第2回です。テキストは、公式ページのOCamlさんと出会った日です。
 内容は、関数と再帰関数についてのまとめです。

関数

定義

 関数は、$${let}$$により定義される。

let 名前 引数 = 式

 $${let}$$による定義では、$${let}$$と$${=}$$の間に、関数名と任意の仮引数が続き、$${=}$$の後に、関数の結果を定義する式がくる。式は関数本体と呼ばれる。
 関数に実引数を適用することで、その実引数が仮引数に束縛されて関数本体の式が評価される。

 OCamlでは、関数は値であり型を有する。その関数の型は、
'引数の型'->'関数本体の式の型' で表される。
 例えば、整数の二乗を求める関数squareは、int->intの型を有する。

# let square = func x -> x*x;;
val square : int -> int = <fun>

 この関数は、整数型の値を引数にとり、整数型の値を返す。

 また、他の関数の例として、与えられた数が偶数か否かを比較演算子$${=}$$により判断する関数square_is_evenは、int->boolの型を有する。

# let square_is_even = fun x -> square x mod 2 = 0;;
val square_is_even : int -> bool = <fun>

 この関数の型int->boolは、OCamlにより導き出される。
 ブール演算子について、連言は$${&&}$$により、選言は$${||}$$により表される。

引数

 関数は複数の引数を取ることができ、引数の区切りには空白が用いられる。これは関数の宣言と、関数適用の式の両方に当てはまる。
 (引数を太字で強調しています。)

宣言
# let ordered = fun a b c -> a <= b && b <= c;;
val ordered : 'a -> 'a -> 'a -> bool = <fun>
適用 
# ordered 1 1 2;;
- : bool = true

型変換

 OCamlは、整数だけでなく、浮動小数点も扱える。ただし、整数とは異なる演算子が用いられる。例えば、加算の演算子は、$${+}$$の代わりに$${+.}$$となる。
  (四則演算の残りと正負の符号もドットが付きます。)
 OCamlでは、暗黙の型変換は行われない。型変換が必要なときは、関数により明示的に型変換を行わなければならない。例えば、整数から浮動小数点への型変換は、関数float_of_intで行う。この関数は、整数型を引数にとり、浮動小数点型を返す。
 (この明示的型変換は、イデオロギー的理由によるみたいです。)


再帰関数

定義

 OCamlで再帰関数を定義するには、再帰的であること明示しなければならない。これは、$${let}$$の代わりに$${let}$$ $${rec}$$を用いることで行う。$${let}$$と$${let}$$ $${rec}$$とは、関数名の有効範囲の点で異なる。
 ($${rec}$$を付けることで、関数名の有効範囲が関数本体にまで及びます。)

  二つの整数a, b(a < b)について[a, b]に含まれる整数からなるリストを求める関数rangeは、

# let rec range = fun a b -> if a > b then [] else a::range (a+1) b;;
val range : int -> int -> int list = <fun>

となる。
 (この例では、else節でrangeを再帰的に呼び出しています。)

if式

 前の例では、$${if…then…else}$$を、条件分岐のために用いた。OCamlの全てについて言えるように、$${if…then…else}$$は式である。$${if}$$式の値は、$${then}$$の部分または$${else}$$の部分を評価した結果となる。
 ($${if…then…else}$$が式であるとの言及は、もしかするとelse節を省略できないという意味も含んでいるのかもしれません。)


まとめ

 今回は、関数と再帰関数について学びました。ずっと説明を読んでいるだけなので、理解できているのか不安です。練習問題がついていればよかったのですが。
 相変わらずコードの部分は、ハイライトがメチャクチャで読み難いです。無理して色を付ける必要ないのに、無能な働き者の典型ですね。
 次回は、型について学ぶ予定です

もう辞めてやる

 noteのダッシュボードのビュー数には、インプレッション数(所謂サムネイルが表示された数)も含まれていることを知ってしまいました。
 つまり、実際に読まれていなくてもビュー数は自動的に増えるわけです(増えないとサムネイルの表示すらないことになるので、もっと悪いです)。

 これまでは、投稿した記事は読まれてはいるけど反応が薄いのだと思っていました。

 しかし、現実には誰も読んでいないから何の反応もなかったのです。このことに気づいてから、やる気がなくなりました。
 壁に向かってブツブツ言っている今の日常と何の違いがあるというのでしょうか。むしろ文字に起こすだけ面倒くさいです。(もちろん面倒くさいのは「投稿」がです、「私」がではありません!)

あっ、やっぱり続けます

 ※ noteでは、記事が読まれた回数がキリのいい数字になったときに通知がきます。このときに表示される回数はビュー数よりもかなり低くなっています。
 このことから、その通知される回数が実際に読まれた数なのかも知れません(処理がお粗末なだけの可能性もありますが、読まれていると解釈したほうが夢があります)。
 そうすると、私の記事は、読まれてはいるけども反応が薄いことになります。

 部屋の壁ではなく、電車の扉に向かってブツブツ言っていたのですね。よかった!よかった!よくねーよ!!


古往今来得ざれば即ち書き得れば即ち飽くは筆の常也。と云うわけで御座います、この浅ましき乞食めに何卒皆々様のご慈悲をお願い致します。