Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#组合两个序列_F#_Functional Programming_Sequences - Fatal编程技术网

F#组合两个序列

F#组合两个序列,f#,functional-programming,sequences,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.desc

我有两个序列,我想以某种方式组合,因为我需要第二个的结果打印在第一个的旁边。该代码当前是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")
目前的结果是

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
然而,我需要它

You have a Keycard
Description =  Swipe to enter
You have a Hammer
Description =  Thump

任何帮助都将不胜感激。

正如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)
然而,我也会告诉你两种组合两个序列的方法,当你真的有两个不同的序列的时候。首先,如果要将这两个序列转换为元组序列,可以使用
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)]
如果要以其他方式组合这两个序列而不是生成元组,请使用
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"]
最后,如果您只想对这两个序列中的每对项目执行一些副作用,那么
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)
这将向控制台打印以下三行:

red: 25
green: 73
blue: 42

请注意,在
Seq.iter
函数中,我没有存储结果。这是因为
Seq.iter
的结果总是
()
,即F#等于
void
的“单位”值。(除了它比
void
有用得多之外,原因超出了此答案的范围。在堆栈溢出中搜索“[F#]单位”,您应该会找到一些有趣的问题和答案,例如。

state.player.playerItems>Seq.iter(有趣的玩家->打印fn“您有%s\n说明=%s”player.name player.description)