假设我有一个起始列表
let test = [1; 2; 3; 4; 5]
Run Code Online (Sandbox Code Playgroud)
我想将第一个元素添加到所有其他元素,然后将第二个元素添加到所有其他元素,依此类推,直到我最终得到像
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]]
Run Code Online (Sandbox Code Playgroud)
对于我的生活,我无法弄清楚哪种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))
Run Code Online (Sandbox Code Playgroud)
这个会生成元组,第一个组件是列表中的一个值,第二个组件是列表左边的组件:
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])]
Run Code Online (Sandbox Code Playgroud)
有了这个,做你想做的事并不难:
let f xs =
List.map (fun (x,xs) -> (x, List.map (fun y -> y+x) xs))
(pick xs)
Run Code Online (Sandbox Code Playgroud)
> 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])]
Run Code Online (Sandbox Code Playgroud)