λx. x K S K @はてな

このブログ内に記載された文章およびコードの著作権は,すべて Keisuke Nakano に帰属します.

OCaml

Booklet Printing

調子に乗って問題を投稿してしまいました. まぁ,110ページの文書をこんな順序で印刷してもホッチキスなどでは止められないかもしれませんが…(止めても非常に嵩張りそう). 参考までにこのサンプルを出力したRubyのプログラムを投稿しておきました.

invert case

ああ,もう縮まないと信じていたのに縮んでしまいました(62B). ちなみに,問題とは無関係かもしれませんが, char_of_intやint_of_charを使うなら, Char.chrやChar.codeを使うほうが短いです. [追記] そして,直後に61Bにする方法を発見.

フィボナッチ

m.ukaiさんの記事より, この前に持っていた直接算出するやつは縮むのかもしれないが、どうやって? 私のは「まじめに計算するやつ」です.というか,m.ukaiさんのような直接算出するプログラムは全く考えていませんでした. ちなみに,"%.0f" は "%.f" でよ…

あなごる

なるものが,巷で流行っているらしくOCamlで何問か参戦(フィボナッチに関してはRubyにも参戦). 要は,指定された入出力を振る舞うプログラムを短いバイト数で書いてみろという話. 現在のところ,フィボナッチや99shinhやinvert caseなどで一時的に一位を…

スーパー pre 記法

スーパーpre記法というのが OCaml にも対応しているらしい. サポートされている言語が妙に多いけど,Vim のシンタックスファイルから導出してるのかな. このリストとほぼ一致してるし. それはさておき,せっかくなのでその記法を使って小ネタを一つ. uni…

LablGL でオロイド

ここを見て思い出したのだが, 昔 lablGL でオロイドを描いて転がして遊んだことがあった. オロイドとは,「2つの直角円錐を底面で貼り合わせ,軸を通る断面(正方形になっている)を 90 度ずらしてできる立体」で 一度転がすだけで全ての面を接地させられ…

がんばればできる

こちらから勝手に引用. Noneというコンストラクタを持つデータ型を定義してしまうと、option型をどうがんばっても使えなくなる。 その上書き定義の前に何か書き加えてもいいんであれば簡単に回避できるけど, 定義した後となるとできなさそうな気もする. …

#009 賢人鳥をまねる

OCaml では,let rec を使わずに再帰関数を模倣することができる. 但し「for ループを使えばできる」とかそういう話ではない. 例えば,階乗を計算する関数 fact は,通常 let rec を用いて,let rec fact n = if n > 0 then n * fact (n-1) else 1 と再帰…

#008 遅延評価の実装

OCaml で遅延(怠惰*1)評価を 実装する方法があるが, 毎回 lazy や Lazy.force を書かないといけないため非常に面倒である. たとえば,ML の授業などでは,type 'a lazy_list = Nil | Cons of 'a * 'a lazy_list lazy_t とすれば簡単,と教わるのではない…

#007 再帰の泣き所

今回のPPLサマースクール (ココも参照)は非常に参考になった. 関数型言語の実装についてはある程度分かった気でいたのだが, 自分の中で大きな勘違いをしていたようだ. それはコンパイルにおけるクロージャ変換のフェーズである. これまで,OCaml でプ…

#006 禁断の Obj

先日,フランスの XML 関係の研究者と共著する機会があり, 「こっちの方が早いだろ」「いやココを変えればこっちの方が」 「いやいやまだまだ改善できる」だの OCaml のコードで文通をしたりしていたが, そんな中,相手のこの一行に愕然としてしまった.ex…

#005 存在型(2)

先日 OCaml で存在型を実装する方法を紹介したが, 前回の例はあまり面白くないものだったので, こちらの記事にある存在型に対して同様の実装をしてみることにする. この記事にもあるように存在型は module として実装することも可能である (こちらの方が…

#004 中置演算子化

Haskell の場合,任意の関数 f に対し, `f` のように `(バッククオート)で囲むことにより中置演算子(infix operator)として用いることができる. 一方,OCaml でユーザが定義できる中置演算子は一部の記号に限定されている. 以下では,OCaml で任意の…

#003 代数的データ型

int 型の要素から成るリストは,type int_list = Nil | Cons of int * int_list のように再帰的に定義され. 'a t = 'a (ここで type 'a t = Nil | Cons of int * 'a ) を満たすような t の最小不動点として捉えることができる. このような代数的データ型…

#002 存在型

あまり面白くない例だが,プリント可能なヘテロジニアス(異種混合)リストを考える. (但し,中身を直接見られないのでただの文字列のリストなのだが…)type hetero = Nil | Cons of ∃'a. 'a * ('a -> string) * hetero Cons の2つ目の引数は,要素を文字…

#001 多相再帰

OCaml では,違う型で再帰する多相関数を書くことが難しい. 以下のデータ型 ('a,'b) twist を考える.type ('a,'b) twist = Nil | Cons of 'a * 'b * ('b,'a) twist 例えば,次の値はデータ型 (int,bool) twist を持っている.let twist_data = Cons(1,true…