2007-12-01から1ヶ月間の記事一覧

多相的関数とパラメトリック多相

次の関数 thrd は3要素のタプルを引数にとって,3番目の要素を返す。 # let thrd (x, y, z) = z;; val thrd : 'a * 'b * 'c -> 'c = <fun>この, 'a,'b,'c を型変数といい,thrd を適用するときには具体的にどんな型がきてもいい。つまり引数のタプルの各要素が</fun>…

演算子

前置・中置演算子も一種の関数なので,ふつうの関数と同じように定義できる。ただし,名前を括弧で囲むのと使える文字に制限がある。 # let (^-^) x y = x * 2 + y * 3;; val ( ^-^ ) : int -> int -> int = <fun> # 2 ^-^ 3;; - : int = 13 # 5 ^-^ 9;; - : int </fun>…

練習問題 3.14

p.67より。 実数上の関数 f に対して定積分 を近似計算する関数 integral f a b を定義しなさい。またこれを使って, を計算しなさい。 近似の方法は台形近似。積分区間を100個の台形に分けて面積を合計する。 # let integral f a b = let d = (b -. a) /. 1…

HTMLを整える

Hpricot とかで Web ページをスクレイピングするときに,対象のページを解析するのが結構めんどくさい。 ページによっては人間が読むのを想定しているとは思えない(というか大抵は想定してない)ような HTML で,読むのにひどく骨が折れる。なのでせめて見…

高階関数と匿名関数

もちろんある。 次の sum_of は 1〜n までの整数それぞれに f を適用して合計を求める関数。 # let rec sum_of f n = if n = 0 then 0 else f n + sum_of f (n-1);; val sum_of : (int -> int) -> int -> int = <fun>f は別のところで定義した関数でもいいし,そ</fun>…

カリー化された関数

OCaml の関数はカリー化されているので,部分適用できる。 # let sum_of_twice = sum_of (fun x -> x * 2);; val sum_of_twice : int -> int = <fun> # sum_of_twice 5;; - : int = 30</fun>

練習問題 3.9

プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~ p.57より。 if式を OCaml の関数で表現することはできません。次の関数はそれを試みたものですが,fact 4 の計算の評価ステップを考え,なぜうまく計算できないのか説明しなさい。 # l…

練習問題 3.11 (2)

本文中で与えられた再帰的な定義で n個の中からm個を選ぶ場合の数 を求める関数 comb を定義せよ,という問題。再帰的な定義は本文(p.51)をみること(書くのが面倒なので)。 # let rec comb n m = if m = 0 then 1 else if n = m then 1 else comb (n-1) m…

練習問題 3.11 (3)

末尾再帰的関数を使ってフィボナッチ数を計算する iterfib # let iterfib n = let rec fibn (x, y) i = if i = n then y else fibn (y, x + y) (i+1) in fibn (0, 1) 1 ;; val iterfib : int -> int = <fun> # iterfib 1;; - : int = 1 # iterfib 2;; - : int = 1</fun>…

条件分岐

else は省略できない。 # let even n = if n mod 2 = 0 then true else false;; val even : int -> bool = <fun> # even 3;; - : bool = false # even 8;; - : bool = true ところで mod が中置演算子なのはへんな気分だ。 # 9 mod 3;; - : int = 0 # (mod) 9 2;;</fun>…

再帰的な関数

再帰的な関数と定義するには rec をつける。 # let rec fact n = if n = 0 then 1 else n * fact (n - 1);; val fact : int -> int = <fun> # fact 3;; - : int = 6 # fact 6;; - : int = 720 あまり大きな整数は表現できないらしい。 # fact 30;; - : int = -738</fun>…

表現できる整数

32bit CPU の場合には, から まで。それぞれ,min_int,max_int として定義されている。 # min_int;; - : int = -1073741824 # max_int;; - : int = 1073741823これを超えると駄目。 # min_int - 1;; - : int = 1073741823 # max_int + 1;; - : int = -1073…

ユークリッドの互除法で最大公約数

プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~ p.51より。再帰的に定義する。 # let rec euclid m n = if m = n then m else if m > n then euclid n m else euclid (n - m) m ;; val euclid : int -> int -> int = <fun> # euclid 12 60</fun>…

相互再帰

2つ(あるいはそれ以上)の関数を and でつないでいっぺんに定義できるがおもしろい。 and の後の関数には let rec が要らない。 # let rec even n = if n = 0 then true else odd (n - 1) and odd n = if n = 0 then false else even (n - 1) ;; val even :…

基本的な型

こないだ買ったOCamlの本プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~を少しずつ読んでいる。まずは基本的な型: int 整数 float 実数 char 文字。''で囲む。 string 文字列。""で囲む。Haskellと違って文字のリストではない。 boo…

演算子

整数と実数で演算子が違う。 整数: +, -, *, / 実数: +., -., *., /. 間違えるとエラーになる。 # 1 + 2;; - : int = 3 # 1.0 + 2.5;; Characters 0-3: 1.0 + 2.5;; ^^^ This expression has type float but is here used with type int # 1.0 +. 2.5;; - …

変数束縛

let式を使う。 # let pi = 3.141529;; val pi : float = 3.141529 # pi;; - : float = 3.141529

関数の定義

これも let式を使う。 # let area_of_circle r = r *. r *. pi;; val area_of_circle : float -> float = <fun> # area_of_circle 1.0;; - : float = 3.141529引数の型を間違えないこと。 # area_of_circle 1;; Characters 15-16: area_of_circle 1;; ^ This expr</fun>…

本買った

プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~作者: 五十嵐淳出版社/メーカー: 技術評論社発売日: 2007/11/29メディア: 単行本(ソフトカバー)購入: 11人 クリック: 169回この商品を含むブログ (51件) を見る

tracをインストールしてみた

インタアクトによってローカライズされた trac-ja を使う。 必要なもの trac (trac-0.10.4-ja-1.zip) http://www.i-act.co.jp/project/products/products.html Subversion (svn-1.4.5-setup.exe) http://subversion.tigris.org/servlets/ProjectDocumentList…