复制列表 OZ 的元素

Duplicate the elements of a list OZ

编写一个函数来复制列表中的每个元素。例如: {复制 [1 2 3]} returns 列表 [1 1 2 2 3 3].

我怎样才能在 OZ mozart 中制作它?我不知道 oz 的 sintaxis,在序言中会是这样的:

even(N) :- 
    N mod 2 =:= 0.    

doubleeven([],[]).

doubleeven([H|T], [H,H|Z]) :-
    even(H),
    !,
    doubleeven(T,Z).

doubleeven([H|T], [H|Z]) :-
    doubleeven(T,Z).

这是一个基于模式识别的解决方案。你检查传入的数据是否是一个列表(即它有一个 Head 和一个 Tail (H|T)),然后第一个元素被绑定到变量标识符 H。这样你就可以通过添加两个来重复H 在你继续对列表的其余部分做同样的事情之前。如果 L 为 nil,请记住 return nil -- 空列表,这样您的最终答案也是一个列表。

declare
fun {Duplicate L}
   case L of H|T then
      H|H|{Duplicate T}
   else
      nil
   end
end

{Browse {Duplicate [1 2 3]}}