F#组合两个序列

Kie*_*Dee 2 f# functional-programming sequences

我有两个序列,我想以某种方式结合,因为我需要在第一个旁边打印第二个的结果.代码是playerItems引用列表的当前位置:

seq state.player.playerItems
      |> Seq.map (fun i -> i.name)
      |> Seq.iter (printfn "You have a %s")

seq state.player.playerItems
      |> Seq.map (fun i -> i.description) |> Seq.iter (printfn "Description =  %s")
Run Code Online (Sandbox Code Playgroud)

结果目前是

You have a Keycard
You have a Hammer
You have a Wrench
You have a Screw
Description =  Swipe to enter
Description =  Thump
Description =  Grab, Twist, Let go, Repeat
Description =  Twisty poke
Run Code Online (Sandbox Code Playgroud)

但是,我需要它

You have a Keycard
Description =  Swipe to enter
You have a Hammer
Description =  Thump
Run Code Online (Sandbox Code Playgroud)

任何帮助都将非常感激.

rmu*_*unn 7

正如Foggy Finder在评论中所说,在你的具体情况下,你真的没有两个序列,你有一个序列,你想为每个项目打印两行,这可以用这样的单一行完成Seq.iter:

state.player.playerItems  // The "seq" beforehand is not necessary
|> Seq.iter (fun player -> printfn "You have a %s\nDescription = %s" player.name player.description)
Run Code Online (Sandbox Code Playgroud)

不过,我也将告诉你两种方式两个序列结合,因为当你真正的时间有两种不同的序列.首先,如果要将两个序列转换为元组序列,则使用Seq.zip:

let colors = Seq.ofList ["red"; "green"; "blue"]
let numbers = Seq.ofList [25; 73; 42]
let pairs = Seq.zip colors numbers
printfn "%A" pairs
// Prints: seq [("red", 25); ("green", 73); ("blue", 42)]
Run Code Online (Sandbox Code Playgroud)

如果要以产生元组的其他方式组合两个序列,请使用Seq.map2并传递一个双参数函数:

let colors = Seq.ofList ["red"; "green"; "blue"]
let numbers = Seq.ofList [25; 73; 42]
let combined = Seq.map2 (fun clr num -> sprintf "%s: %d" clr num) colors numbers
printfn "%A" combined
// Prints: seq ["red: 25"; "green: 73"; "blue: 42"]
Run Code Online (Sandbox Code Playgroud)

最后,如果您只想对两个序列中的每对项目执行一些副作用,那么Seq.iter2您的朋友是:

let colors = Seq.ofList ["red"; "green"; "blue"]
let numbers = Seq.ofList [25; 73; 42]
Seq.iter2 (fun clr num -> printfn "%s: %d" clr num)
Run Code Online (Sandbox Code Playgroud)

这会将以下三行打印到控制台:

red: 25
green: 73
blue: 42
Run Code Online (Sandbox Code Playgroud)

注意在Seq.iter函数中,我没有存储结果.那是因为结果Seq.iter总是(),"单位"值是F#的等价物void.(除了因为void超出本答案范围的原因它更有用.搜索"[F#]单元的堆栈溢出",你应该找到一些有趣的问题和答案,比如这个.