假设我有一个起始列表
let test = [1; 2; 3; 4; 5]
我想将第一个元素添加到所有其他元素,然后将第二个元素添加到所有其他元素,依此类推,直到我最终得到类似
result = [1, [3; 4; 5; 6];
2, [3; 5; 6; 7];
3, [4; 5; 7; 8];
4, [5; 6; 7; 9];
5, [6; 7; 8; 9]]
对于我的一生,我无法弄清楚哪种 List.n
方法在这里是合适的,甚至有一个。我知道 List.map
不会这样做,我认为 List.reduce
或 List.fold
也不会这样做,因为它们都是累加器,而不是单独的函数。
有没有办法做我想做的事?
感谢您的帮助
最佳答案
我不认为 List
模块中有一个可以轻松使用的直接函数,但有一个函数不时有用,并且您可以轻松定义自己:
let rec pick xs =
match xs with
| [] -> []
| (x::xs) -> (x,xs) :: (List.map (fun (x',xs') -> (x',x::xs')) (pick xs))
这将产生元组,其中第一个组件是列表中的一个值,第二个组件是列表的左侧:
pick [1..5] =
[(1, [2; 3; 4; 5])
;(2, [1; 3; 4; 5])
;(3, [1; 2; 4; 5])
;(4, [1; 2; 3; 5])
;(5, [1; 2; 3; 4])]
有了这个,做你想做的事并不难:
let f xs =
List.map (fun (x,xs) -> (x, List.map (fun y -> y+x) xs))
(pick xs)
示例
> f [1;2;3;4;5];;
[(1, [3; 4; 5; 6])
;(2, [3; 5; 6; 7])
;(3, [4; 5; 7; 8])
;(4, [5; 6; 7; 9])
;(5, [6; 7; 8; 9])]
关于f# - 将列表上的函数应用于所有其他列表成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36802958/