2008-03-01から1ヶ月間の記事一覧

Problem 12

今日は Problem 12をやってみた。cf. Project Euler - Problem 12 via 自堕落系徒然日記 - Problem 12 三角数の約数 import Data.List triangleNumbers :: [Integer] triangleNumbers = snd $ mapAccumL (\a x -> (a+x, a)) 1 [2..] divisors :: Integer -> …

unfold で1から10までのリスト

unfold を覚えたので,こないだの1から10までのリストを unfold を使ってやってみる。 と思ったら unfold が見つからないのでまずはその定義から。 # let rec unfold f init = match f init with Some (a, b) -> a :: unfold f b | None -> [] ;; val unfold…

Sys.argv

コマンドライン引数は Sys.argv に配列として格納される。インデックス0がプログラム名で,以下引数の数だけ続く。 インデックス0を出力する例: let () = print_endline Sys.argv.(0) ^o^ >ocamlc -o argv.exe argv.ml ^o^ >argv argvインデックス1を出力す…

Array.iter

Array.iter は配列に対して 'a -> unit 型の関数を順に適用する関数。List.iter の配列版。これを使えばコマンドライン引数の数だけ繰り返せる。 let () = Array.iter (fun s -> print_endline s) Sys.argv ^o^ >argv2 foo bar buz argv2 foo bar buz

unfold

なるほど,unfold ってこういうふうに使えるのか。cf. ZOETROPEの日記 - Foundations of F#を読む(3)Haskellでやってみる。 *Main> take 10 $ Data.List.unfoldr (\(n0,n1) -> Just (n0, (n1, n0+n1))) (1, 1) [1,1,2,3,5,8,13,21,34,55] unfoldr に与える関…

インターフェイスファイル

ソースファイル(=モジュール)と同名で拡張子が .mli のファイルを用意しておくことで,モジュールにシグネチャを与えることができる。 前にも例に挙げた Table モジュールを例にとると, table.mli type ('a, 'b) t val empty : ('a, 'b) t val add : 'a -…

コンパイラがcmiを探すディレクトリ

次のディレクトリを順に検索する。 ocamlc コマンドを起動したディレクトリ ocamlc コマンドの -I オプションで指定したディレクトリ 標準ライブラリのディレクトリ

Problem 2

今日は Problem 2。フィボナッチ数列のうち4,000,000以下で偶数のみを合計せよ,という問題。cf. http://projecteuler.net/index.php?section=problems&id=2Haskell ではやってる人がいるので,OCaml でやってみた。 let fibs_under_n n = let rec fibs a b …

1から10までのリスト

って OCaml ではどう書けばいいんだろう。 Haskell では簡単に [1..10] と書ける。 Prelude> [1..10] [1,2,3,4,5,6,7,8,9,10]これなら10といわずいくつまででも簡単だ。だけど OCaml こういう書き方はできないらしい。 # [1..10];; Characters 4-6: [1..10];…

分割コンパイル

ソースファイルは1つじゃなくてもいい。次の例では,fact関数を定義している fact.ml と,それを呼び出す main.ml に分けている。fact.ml let rec fact n = if n = 0 then 1 else n * fact (n-1) main.ml let () = print_int (Fact.fact 5) OCamlではファイ…

コンパイラ

OCaml のコンパイラには ocamlc と ocamlopt の二つがある。 ocamlc バイトコードを出力。機種非依存。 ocamlopt ネイティブコードを出力。機種依存。 ocamlc の出力したバイトコードはどの機種でも動作するけど,ただし,バイトコートインタプリタというプ…

mainに相当する関数

OCamlにはない。 代わりに, let () = ...とか let _ = ...とかするみたい。 let hello () = print_string "Hello world!\n" let () = hello () ^o^ >ocamlc -o hello.exe hello.ml ^o^ >hello Hello world!

Probrem 21

今日は Probrem 21 をやってみた。cf. http://projecteuler.net/index.php?section=problems&id=21数 n に対して約数(nを含まない)すべてを足しあわせる関数 d があるとして,d(a) = b かつ d(b) = a となるような a と b (ただしa≠b)を amicable pair,…

Project Euler

ってのがあるのか。cf. http://projecteuler.net/index.php via Life Goes On - はじめました気が向いたときにはやってみるかな。 とりあえず Problem 1 を内包表記で。 euler0001 :: Int -> Int euler0001 n = sum [x | x <- [1..(n-1)], or [x `mod` 3 == …

コラッツ予想

cf. Way of My Life - コラッツ予想Haskell と OCaml でやってみた。 与えられた数から1になるまでをリストで返す。 collatz :: Int -> [Int] collatz 1 = 1 : [] collatz n | n `mod` 2 == 0 = n : collatz (n `div` 2) | otherwise = n : collatz (n * 3 +…