読者です 読者をやめる 読者になる 読者になる

パスカルの三角形を 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) } のように無理やり書いたのですけど。