什么是Seq.iter的替代品,以便我可以返回最后一项的操作结果?

时间:2016-03-18 14:00:07

标签: f#

什么是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

2 个答案:

答案 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