如何在列表上递归执行操作?
具体来说,在我的情况下,我有一个带有元组结构的列表如下:
// ("name", (startX, startY), (endX, endY))
let list =
[
("rectangle", (10, 10), (90, 90));
("ellipse", (30, 50), (40, 60));
("ellipse", (60, 50), (70, 60))
]
我想对“矩形”项目执行一个操作,对“椭圆”项目执行另一个操作。
答案 0 :(得分:2)
一种简单的惯用方法是使用标准数据收集功能和组合器,而不是具有签名string*coord*coord -> (coord -> coord -> unit)
的自定义“调度程序”功能,以及一组处理器功能,每种形状一个。即对于您的列表成员,对通信延续处理器的简单调度程序可能是:
let dispatcher = function
| (shape,startC,endC) when shape="rectangle" -> dorectangle startC endC
| (shape,startC,endC) when shape="ellipse" -> doellipse startC endC
| ...........
| _ -> failwith "Unknown shape"
其中doellipse
是一个知道如何绘制椭圆等的处理器
然后你用它作为
[your list] |> List.iter dispatcher
答案 1 :(得分:0)
[list] |> List.filter (fun e -> (fst e) = "rectangle") |> List.iter actionRectangle
[list] |> List.filter (fun e -> (fst e) = "ellipse") |> List.iter actionEllipse