2007-01-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…

呼んだのは誰?

cf. どう書く?.org - 呼んだのは誰?Kernel#caller なんて初めて使った。 def foo /.*`(.+)'/ =~ caller(1)[0] $1 end def bar; foo; end def baz; foo; end p bar p baz ^o^ >ruby caller.rb "bar" "baz"

ダブル完全数

cf. どう書く?.org - ダブル完全数HaskellのほうがRubyよりすっきりしてるな。 divisors n = filter ((==0).mod n) [1..(n `div` 2 + 1)] isDoublePerfectNumber n = (sum.divisors) n == (n*2) main = mapM_ (putStrLn.show) $ filter isDoublePerfectNumb…

長方形の交差判定

cf. どう書く?.org - 長方形の交差判定 問題文中の top 判定方法は,要するに一方の長方形の4つある頂点のどれかか,もう一方の長方形の内部にあれば重なってると判定していいわけだ。 今日はRubyで書いた。 class Rect def initialize(left, top, right, …

アルファベットの繰り上がり

cf. どう書く?.org - アルファベットの繰り上がりsucc でいいじゃん,と思ったらダメだった。 Prelude> succ 'A' 'B' Prelude> succ 'Z' '['Ruby の String#succ はうまくやってくれるのに。 なら,26進数だと考えて素直に繰り上がりを処理すればいいか……と…

倍数になる13進数

cf. どう書く?.org - 倍数になる13進数 module Main (main) where fromDecimal :: (Integral a) => a -> a -> a fromDecimal n x = f 0 x 1 where f r 0 _ = r f r y z = f (r + (y `mod` 10) * z) (y `div` 10) (z * n) main :: IO () main = putStr $ sho…

/*コメント*/を取り除く

cf. どう書く?.org - /*コメント*/を取り除く正規表現の最短一致を使ってこれでいいはず……だと思うんだけど。 def remove_comment(str) str.gsub(/\/\*.*?(\*\/|\z)/,"") end samples = %w( AAA AAA/*BBB*/ AAA/*BBB AAA/*BBB*/CCC AAA/*BBB/*CCC*/DDD*/EEE…

アレイのuniq

cf. どう書く?.org - アレイのuniq再帰で uniq [] = [] uniq (x:xs) = x:uniq (filter (/=x) xs) と書いてから,こんな関数ありそうだなぁと思ったらやっぱりあった。 Data.List nub 高階関数版: uniq2 :: (Eq a) => [a] -> [a] uniq2 = foldl (\a e -> if…

delete blank lines

現実逃避的にアナーキーゴルフ。 cf. anarchy golf - delete blank linesこれで26バイト。どうやったら12バイトでできるんだ? $><<$<.read.gsub(/^\n/,"")

はてなダイアリーライター Version 1.4.1 を試してみた

以前に試したときにはどういうわけだかうまくいかなかってけど,今度はうまくいったので(ちょっとはまったけど),メモ。 はてなダイアリーライター本体はここから(Version 1.4.1)。マニュアルもここ。 http://www.hyuki.com/techinfo/hatena_diary_write…

はてなダイアリーライター Version 1.4.1 を試してみた(その2)

id:takatoh:20070708:hw のつづき。Crypt::SSLeayをインストールしたらエラーになった件。いろいろ試した結果,クッキーファイル(cookie.txt)の有無と関係が有ることがわかった。表にするとこんな感じ。 cookie.txtあり cookie.txtなし Crypt::SSLeayなし …