Переписываем и хаскеля в камл Тут в
http://www.livejournal.com/community/ru_lambda/5507.html написана замечательная программа.
Я попытался переписать ее на камл, получилось почти буква в букву:
let scanl f i l =
let rec aux i = function
[] -> []
| x :: xs ->
let ir = f i x in
ir :: (aux ir xs) in
i :: (aux i l)
let flip f a b = f b a
let rec rmake = function
0 -> []
| n -> n :: (rmake (n - 1))
let lmake n = List.rev (rmake n)
let (^) f g x = f (g x)
let apply f x = f x
(**************)
let move (top::xs, ys, zs) = (xs, top::ys, zs)
let yz (x,y,z) = (x,z,y)
let xz (x,y,z) = (z,y,x)
let twist g f = g ^ f ^ g
let rec moves = function
0 -> []
| n -> List.map (twist yz) (moves (n - 1)) @ move :: List.map (twist xz) (moves (n - 1))
let hanoi n =
scanl (flip apply) ((lmake n), [], []) (moves n)
за тем малым исключением, что пришлось написать часть библиотечных функций.
Что самое забавное, hugs, который в debian/stable, падает по sigv раньше, что ocaml(top) начинает говорить stack overflow. Желающие могут проверить ocamlopt :-)
PS: битик в unboxed values воруется для того что бы всегда можно было знать что это: значение или указатель. Именно из-за этого у камла быстрая арифметика.