将列表上的函数应用于每个其他列表成员

Ste*_*ven 3 f#

假设我有一个起始列表

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.reduceList.fold将会这样做,因为这些都是累加器而不是单独的功能.

有没有办法做我想做的事情?

谢谢你的帮助

Car*_*ten 7

我不认为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)