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