Мне часто говорят, что, используя модуль Lazy
в OCaml, можно делать все, что вы можете делать на ленивом языке, таком как Haskell. Чтобы проверить это утверждение, я пытаюсь написать функцию, которая преобразует обычный список в статический двусвязный список в ocaml.
type 'a dlist = Dnil | Dnode of 'a dlist * 'a * 'a dlist
Учитывая этот тип, я могу вручную создать несколько статических двусвязных списков:
let rec l1 = Dnode (Dnil,1,l2)
and l2 = Dnode (l1,2,l3)
and l3 = Dnode (l2,3,Dnil)
но я хотел бы написать функцию типа 'a list -> 'a dlist
, которая по любому списку строит статический двусвязный список в OCaml. Например, учитывая [1;2;3]
, он должен вывести что-то эквивалентное l1
выше.
Алгоритм довольно просто написать на Haskell:
data DList a = Dnil | Dnode (DList a) a (DList a)
toDList :: [a] -> DList a
toDList l = go Dnil l
where
go _ [] = Dnil
go h (x:xs) = let r = Dnode h x (go r xs) in r
но я не смог понять, где делать вызовы lazy
, чтобы это скомпилировалось в OCaml.
'a dlist
, а не'a DList
. ;) - person Jeff Mercado   schedule 28.04.2011