【发布时间】:2018-08-11 16:35:54
【问题描述】:
我需要
编写一个int * 'a * 'a list -> 'a lst 类型的函数separate 使得
separate (k, x, l) 返回在列表l 的每个k 元素之后插入元素x 的列表l(从
列表的末尾)。例如,separate (1, 0, [1,2,3,4]) 应该返回 [1,0,2,0,3,0,4] 和
separate (3, 0, [1,2,3,4]) 应该返回 [1,0,2,3,4]。
到目前为止,这就是我所拥有的,但它会导致错误。谁能帮帮我?
fun separate (k: int, x: 'a, l: 'a list) : 'a list =
let val count:int = k
in foldr(
(fn (h, t) =>
if count = 0
then count := 1 in
x::h::t
else count = count + 1 : int
h::t
)
【问题讨论】:
-
count := 1 in不是做let val count = 1 in之类的事情的方法,而且,你似乎在思考。您是否要变异计数? -
是的,每次我查看列表中的一个元素时,我都会尝试减少计数,从后面开始一直移动到开头。一旦计数为零,我们就知道我们在我们需要的位置,然后将元素插入到列表中的那个位置。我也很难不去思考。没有 foldl/foldr 有没有办法做到这一点?我使用了其中任何一种,因为它似乎可以简化问题。
-
值在纯函数式编程中是不可变的。 “减少计数”是什么意思?如果您想做类似的事情,您需要将
count设为函数(主函数或辅助函数)的参数之一。