ブックマーク / keisukenakano.hatenablog.com (2)

  • Pretty printers for tuples, variants, records, Sets and Maps. - λx. x K S K @はてな

    10/4まで北京泊・10/5 京都泊・10/6 東京泊・10/7 機内泊・10/8からシドニー泊…という激しいスケジュールを経て NICTA を訪問中です. 最近,再び OCaml のコードをたくさん書く機会ができたので, 久しぶりに OCaml プログラミングに関するメモを公開します. Ruby には p という便利な関数 (メソッド) があってどんな値でも可視化できますが, OCaml だと自分で書かなきゃいけなくて面倒です. extlib に Std.print という関数がありますが,これは実行時の値を出力する関数なので, 実行時に単なる組になってしまうレコードやバリアントではフィールドやコンストラクタの名前が失われてしまい,十分な可視化ができているとは言えません.このため,結局自分で書く必要があります. 今回紹介する print.ml はそれを補助するプログラムで,先日公開した

    Pretty printers for tuples, variants, records, Sets and Maps. - λx. x K S K @はてな
    skymountain
    skymountain 2011/01/08
    pretty printer
  • λx.x K S K @ はてな - #009 賢人鳥をまねる

    OCaml では,let rec を使わずに再帰関数を模倣することができる. 但し「for ループを使えばできる」とかそういう話ではない. 例えば,階乗を計算する関数 fact は,通常 let rec を用いて, let rec fact n = if n > 0 then n * fact (n-1) else 1 と再帰的に定義されるが,次のように let rec を使わなくても定義できる.let turing (`M x) y = y (fun z -> x (`M x) y z) let fact = turing (`M turing) (fun f n -> if n > 0 then n * f (n-1) else 1) ちょっと読み難いが,実際に fact 10 と実行してみれば, 3628800 と正しい出力が得られることが確認できるだろう. このカラクリを支えている

    λx.x K S K @ はてな - #009 賢人鳥をまねる
  • 1