首先,我知道如何在f#中追加列表。如果我有list = [1;2;3],那么我可以做一些类似5 :: list的事情,它会给我一个新的列表[5;1;2;3]。
然而,我已经编写了一个函数,它使用完全相同的语法,但却将其追加到列表的后面,我无法在我的一生中找到原因。有人能给我解释一下为什么我写的函数在我的列表后面而不是前面附加和项目吗?
let menu = [("pizza",17);("hotdog",5);("burger", 12);("drink",3);("milkshake",4)]
let rec insert dict key value =
match dict with
| (k,v) :: tl when k = key -> (k,v)::tl
| (k,v) :: tl -> (k,v)::insert tl key value
| [] -> (key,value) :: []
> insert menu "bacon" 22;;
val it : (string * int) list =
[("pizza", 17); ("hotdog", 5); ("burger", 12); ("drink", 3);
("milkshake", 4); ("bacon", 22)]我并不关心它是以哪种方式添加到我的列表中的,我只是不明白为什么当我使用反操作符时它会结束。
发布于 2018-02-26 11:48:25
您总是在空列表的前面插入新的对,这是实际列表末尾的最后一个尾。
因此,如果我们考虑这个例子:
insert [(1, 2)] 3 4
// Returns [(1, 2); (3, 4)][(1, 2)]也可以这样编写:
(1, 2) :: []您的代码有效地做到了这一点:
(1, 2) :: (3, 4) :: []发布于 2018-02-26 11:50:13
您的insert是一个递归函数。遍历每个元素,直到到达空列表的底部为止。如果没有找到该元素,则返回一个元素列表,并添加元素。因为您在底部,现在在您浏览列表之前的所有元素都会被添加到这个列表的顶部。
因此,总的来说,您的新项目将添加在末尾,或附加。
https://stackoverflow.com/questions/48987528
复制相似问题