OCaml

また再帰

自然数の構造に従った再帰 自然数:0から始まり、1,2,3と増え、無限に続く数。 自然数の様な無限に続くデータ構造を扱う場合には、まず、曖昧性の無い形で定義することが重要になる。 0は、自然数である。 nが自然数ならn+1も自然数である。 階乗を求める再帰…

関数のネスト

関数呼び出しの結果を、他の関数に渡すこと(関数のネスト、入れ子)で シンプルな関数を組み合わせて、全体として複雑な処理を簡単に行うことが出来る。整数のリストを受けとったら、それを昇順にして返す関数(挿入法) (* 整数リストと整数nを受けとったら、…

再帰関数

与えられたリストに0があるかどうかを調べる関数を作ってみる。 (* リスト内に0が含まれているかを調べる *) (* contain_zero : int list -> bool *) let contain_zero lst = match lst with [] -> false | first :: rest -> if first = 0 then true else fa…

リスト

リストの構造 リスト=同じ型のデータが任意の数並んだデータ ※レコードは、複数のデータが決められた個数だけ並ぶ。 空のリスト Ocamlでは空のリストはで表現する。(要素が0個のリスト) 空のリストに要素を加えるには 追加する要素 :: [] と書く。 (* 曜日の…

さらにレコード

「プログラミングの基礎」の目標であるメトロネットワーク最短路問題にレコードを応用する。 必要な情報の定義 まず、メトロネットワークの構造のうち、駅名を定義する。 駅名の情報は 駅名 ひらがな ローマ字表記 所属する路線名 の4つの情報を持つレコード…

レコード

レコード 前回は、内部構造を持つデータとして「組」というのをやった。 以下のような形で記述することで、hogeのとった点数は80であるというデータを表す。 ("hoge", 80) ただ、これだと常に(名前, 点数)の順番、要素の数を守らないといけないのと 単純にデ…

組とパターンマッチ

組 : 複数のデータを並べて1つのデータにしたもの。 今までのような単純な数値や、文字列ではなく それらを組み合わせて1つのデータを形成する。2次元平面上の座標のような感じで # (3.14, 2.71) ;; - : float * float = (3.14, 2.71) という、float * float…

エラーの種類

構文のエラー 構文がおかしいとき。 # let x 3 ;; Error: Syntax error 変数を宣言してるのに「=」がない。「;;」にアンダーラインが現れる。 他にも、if文でthenが無いとか、()の対応がおかしい場合はこれ。 未定義の変数 # 3 + a ;; Error: Unbound value …

条件分岐

条件分岐 if 条件 then 式 else 式 条件はbool型 then,elseの式は同じ型の持つ必要がある #if 2 < 1 then 3 else 4 ;; - : int = 4 #if "true" = then 3.14 else 2.72 ;; Error: This expression has type string but is here used with type bool #if "a" =…

関数の作り方

前回の復習。 関数の定義 作成する関数の目的を考える -> 関数の型(引数、戻り値)を決める 入力と出力、テストプログラムを書く 関数の本体を作る 2.で作ったテストで動作を確認 ※1.はコメントとしてちゃんと書いておく そういえば、「プログラミングの基礎…

関数。の続き

関数の型 # let f x = (x *. x) *. 22. ;; val f : float -> float = <fun> val f : float -> float = fは float型xを受け取ったら float型の値を返す 関数である と読む。 上の例では、float型xを受け取ったら、float型の値を返すので 関数fはfloat型ぽいけれど</fun>…

変数の補足

変数の話で、「らしい」を連発してますが 時給を表す変数を書き換えるだけで良くなる。 と、これだと、定数を定義してるのと変わらないけれども。。 関数型言語での変数は基本、書き換えることが出来ない「らしい」。 1回定義したら、そのまま。 上の例で「w…

プログラミングの基礎-2

変数 # let 変数名 = 式 ;; 変数が必要になる時というのは、ある同じデータが複数必要な時。 例えば、1ヶ月のバイト代を計算してみると (* 時給950円で週3回(5時間、4時間、8時間)働いた月の給料 *) # ((950 * 5) + (950 * 4) + (950 * 8)) * 4 ;; という様…

プログラミングの基礎-1

プログラマーズホリデーにて情報を入手した「プログラミングの基礎/浅井健一」をしこしこやっていこうと思います。 関数型言語OCaml(オーキャムル) 関数型言語 単純、かつ強力 = より人間の思考レベルに近い記述が出来る 記述量が少ない プログラミングは、…