パスカルの三角形を OCaml で
OCaml で書いてみようとふと思い立ったのですが、二番煎じっぽいものしかできませんでした……。
let rec next_pascal_sub ls ld x = match ls with [] -> x :: ld | hd :: tl -> next_pascal_sub tl ((x + hd) :: ld) hd;; let next_pascal l = next_pascal_sub l [] 0;; let rec pascal_sub n l = if n = 0 then l else pascal_sub (n-1) (next_pascal l);; let pascal n = pascal_sub n [1];;
リスト操作系でハッとするコードといえば、やっぱり無限リストが一番ですね。そうなると、Haskell のほうがずっと書きやすそうです。
なお、リスト操作でシンプルに行きたいときには、上記 next_pascal を以下のように書き換えます。
let next_pascal l = List.rev_map2 (+) (0 :: l) (l @ [0]);;
ただ、l @ [0] がどう考えても不恰好なんですよね……。
ところで、にわか OCaml 使いのため、関数適用を n 回行うという操作を OCaml ですっきり書く方法が分かりませぬ。Ruby では (1..n).inject(v) { |x, _| f(x) } のように無理やり書いたのですけど。