什么是Seq.iter的替代品,以便我可以返回最后一项的操作结果?
Seq.iter返回一个单位。但是,我想迭代我的集合并返回最后的结果。
请考虑以下代码:
let updatedGrid = grid |> Map.toSeq
|> Seq.map snd
|> Seq.iter (fun c -> grid |> setCell c
注意:SetCell返回一个新Map:
以下是实际代码:
let setCell cell (grid:Map<(int * int), Cell>) =
grid |> Map.map (fun k v -> match k with
| c when c = (cell.X, cell.Y) -> { v with State=cell.State }
| _ -> v)
let cycleThroughCells (grid:Map<(int * int), Cell>) =
let updatedGrid = grid |> Map.toSeq
|> Seq.map snd
|> Seq.iter (fun c -> grid |> setCell c
|> ignore)
updatedGrid
同样,我只想获取iter函数中最后一个操作的结果
[增订]
我认为这有效(使用地图):
let cycleThroughCells (grid:Map<(int * int), Cell>) =
let updatedGrid = grid |> Map.toSeq
|> Seq.map snd
|> Seq.map (fun c -> grid |> setCell c)
|> Seq.last
updatedGrid
答案 0 :(得分:3)
我不认为一个存在,但你可以使用fold
定义自己的:
let tapSeq f s = Seq.fold (fun _ x -> f x; Some(x)) None s
答案 1 :(得分:3)
正如我在评论中所说,看起来你几乎肯定想要折叠,以便更新的网格传递到每个连续的调用;除了最后一个修改以外,所有修改都被删除。
我认为这样可以解决问题:
let cycleThroughCells (grid:Map<(int * int), Cell>) =
grid
|> Map.toSeq
|> Seq.map snd
|> Seq.fold (fun grid c -> grid |> setCell c) grid
如果您将参数重新排序到setCell
以便grid
参数首先出现,那么最后一行可以是|> Seq.fold setCell grid
。