f# - 将列表上的函数应用于所有其他列表成员

标签 f#

假设我有一个起始列表

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.reduceList.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/

相关文章:

class - 使用 F# 在显式对象构造函数中失败

f# - 如何将 app.config 用于带有 FSharp.Data.TypeProviders 的数据库连接字符串?

F# 常量模式匹配和检查消除

f# - 在 F# 中将字符串列表转换为 float /整数

docker - 如何将 Docker 与 Paket 结合使用?

.net - F# null 测试未能检测到 null 值

F# 将函数应用于列表树的每个节点中的值

.net - 检查 F# 泛型参数是否具有相等或比较约束

c# - 在哪些领域使用 F# 比 C# 更合适?

performance - 一般如何优化 F# 程序