OCaml

ぐいぐい

コンパイルのやり方とか、ファンクターとか、オブジェクトとか、ラベル付き引数とか、オプション引数とか、多相ヴァリアントとかいろいろやったけど、全部すっ飛ばしていきなりGUI。 お金を預けたり引き出したりする簡単なプログラム。 open Tk open Printf …

foldコマンド

let version="0.1" let display_width = ref 80 let filenames = ref [] let spec = [("--width", Arg.Int (fun w -> display_width := w), "Set width of lines"); ("-version", Arg.Unit (fun () -> Printf.printf "fold in OCaml ver: %s\n" version), "D…

wcコマンド

let version = "0.1" let display_byte_count = ref false let display_line_count = ref false let display_word_count = ref false let filenames = ref [] let spec = [("-c", Arg.Set display_byte_count, "Display the byte counts."); ("-l", Arg.Set …

catコマンド

これもまた簡単に実装できた。 入出力関係は素直に書こうとするとやっぱり手続き型言語みたいになっちゃうのかな。 let version = "0.1" let display_linenum = ref false let filenames = ref [] let spec = [("-n", Arg.Set display_linenum, "Display lin…

円周率を求めてみる

なんとなくやりたくなったからやってみた。 意外と素直にあっさり書けた。やっぱり有理数型があるとこういうの楽だなぁ。 使ったアルゴリズムは、円周率 - Wikipediaで見つけたこの式。 arcsin(x)のx=1/2におけるテイラー展開で、収束が速いらしい。へぇー。…

Queueの二通りの定義の仕方

シグネチャの定義 # module type QUEUE = sig type 'a t exception Empty val empty: 'a t val add: 'a t -> 'a -> 'a t val take: 'a t -> 'a * 'a t val peek: 'a t -> 'a end;; module type QUEUE = sig type 'a t exception Empty val empty : 'a t val …

二分探索木を用いたテーブルの定義

# module type TABLE = sig type ('a, 'b) t val empty : ('a, 'b) t val add : 'a -> 'b -> ('a, 'b) t -> ('a, 'b) t val retrieve : 'a -> ('a, 'b) t -> 'b option val dump : ('a, 'b) t -> ('a * 'b) list end;; module type TABLE = sig type ('a, 'b…

任意精度の有理数計算によるNewton-Raphson法

# open Num;; # (* f'(x)を求める *) let deriv f = let dx = Int 10 **/ Int (-50) in fun x -> (f (x +/ dx) -/ f x) // dx;; val deriv : (Num.num -> Num.num) -> Num.num -> Num.num = <fun> # (* f(x), f(f(x)), f(f(f(x))), ..., を計算していき、ステップ</fun>…

書き換え可能なデータ構造を使ったキュー

いつもの如くまずは型の定義。 # type 'a mlist = MNil | MCons of 'a * 'a mlist ref;; type 'a mlist = MNil | MCons of 'a * 'a mlist ref # type 'a queue = {mutable head : 'a mlist; mutable tail : 'a mlist};; type 'a queue = { mutable head : 'a…

unit型を使った無限数列

# type 'a seq = Cons of 'a * (unit -> 'a seq);; type 'a seq = Cons of 'a * (unit -> 'a seq) # let rec from n = Cons (n, fun () -> from (n+1));; val from : int -> int seq = <fun> # let rec take n (Cons (x, f)) = if n > 0 then x :: take (n-1) (f </fun>…

素数の無限数列

# let rec prime_seq primes x = let x' = x + 1 in let rec is_prime n = function [] -> true | p :: rest -> p*p <= x' && n mod p <> 0 && is_prime n rest in if is_prime x' primes then Cons (x', prime_seq (x' :: primes)) else prime_seq primes x…

無限数列

整数の無限数列のジェネレータみたいなもの。 # type intseq= Cons of int * (int -> intseq);; type intseq = Cons of int * (int -> intseq) フィボナッチ数列のジェネレータ # let fib = let rec f x y = Cons (x, f (x+y)) in Cons (1, f 1);; 実際に計…

足し算・かけ算からなる数式を表す型

まずは型の定義。 # type arith = Const of int | Add of arith * arith | Mul of arith * arith;; type arith = Const of int | Add of arith * arith | Mul of arith * arith 式を評価する関数・文字列に変換する関数・展開する関数 # let rec eval = func…

久々OCaml

引き続き練習問題。 # type token = PCDATA of string | Open of string | Close of string;; type token = PCDATA of string | Open of string | Close of string # type ('a, 'b) xml = XLf of 'b option | XBr of 'a * ('a, 'b) xml list;; type ('a, 'b)…

昨日の続き(二分木とバラの木)

木構造の定義 # type 'a tree = Lf | Br of 'a * 'a tree * 'a tree;; type 'a tree = Lf | Br of 'a * 'a tree * 'a tree # type 'a rosetree = RLf | RBr of 'a * 'a rosetree list;; type 'a rosetree = RLf | RBr of 'a * 'a rosetree list # let rtree …

再帰的データ型(二分木)

さっそくデータ型を定義。大きさと深さを求める関数も定義。 # type 'a tree = Lf | Br of 'a * 'a tree * 'a tree;; type 'a tree = Lf | Br of 'a * 'a tree * 'a tree # let rec size = function Lf -> 0 | Br (_, left, right) -> 1 + size left + size …

再帰的データ型

さらに引き続きOCaml勉強中。この本を使って勉強しています。 プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~作者: 五十嵐淳出版社/メーカー: 技術評論社発売日: 2007/11/29メディア: 単行本(ソフトカバー)購入: 11人 クリック: 16…

多相的ヴァリアントとデータ構造とパターンマッチ

練習問題を解いたら結構長いコードになった。せっかくなので、記念カキコ。 作って満足してしまった。動作確認はまた今度。 (* 図形を定義 *) type figure = Point | Circle of float | Rectangle of float * float | Square of float;; (* 座標情報をもった…

引き続きOCaml

自然数rについて、x*x + y * y = rを満たす自然数(x, y)のリストを返す関数 ただし、x ≧ y ≧ 0 # let squares r = let isqrt n = int_of_float (sqrt (float_of_int n)) in let y_max = isqrt (r / 2) in let rec get_list y list = if y >= y_max then list…

KコンビネータとSコンビネータ

OCaml勉強中。KコンビネータとSコンビネータが出てきた。 OCamlでfun式と関数適用の組み合わせ「のみ」で表現できる関数はSとKのを関数適用で組み合わせることですべて表現できることが知られています。 # let s x y z = x z (y z);; val s : ('a -> 'b -> '…