|
| |||
|
|
Переписываем и хаскеля в камл Тут в http://www.livejournal.com/community/ru_ Я попытался переписать ее на камл, получилось почти буква в букву: 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 воруется для того что бы всегда можно было знать что это: значение или указатель. Именно из-за этого у камла быстрая арифметика. Добавить комментарий: |
|||||||||||||