2014-01-11 88 views
0

如何以遞歸方式在列表上執行操作?以遞歸方式在列表上執行多個操作

Specificly在我的情況,我有一個元組結構的名單如下:

// ("name", (startX, startY), (endX, endY)) 

let list = 
[ 
    ("rectangle", (10, 10), (90, 90)); 
    ("ellipse", (30, 50), (40, 60)); 
    ("ellipse", (60, 50), (70, 60)) 
] 

我要爲那些「矩形」 S和那些項目另一個行爲「的項目執行一個動作橢圓形「S。

+1

這是一個相當廣泛的問題。你可以使用GDI +和F#,這將允許你渲染圖形。建議你有一個去並修改你的問題。下面是一個使用GDI +和F#的示例:http://www.c-sharpcorner.com/Blogs/647/using-gdi-with-fsharp.aspx – geedubb

+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 
+0

'let drawList = list |> List.iter dispatcher'不起作用。並且使用'myGraphics.Graphics.DrawImage(myBitmap,Point(x,y))'來代替「dorectangle startC endC」。錯誤是:'類型不匹配。期望一個List ref - >'a但是給出了一個'b list - > unit'類型'List ref'與列表類型''不匹配。我的列表如下所示:'let list:(string * int * int)列表ref = ref []' –

+0

如果您發現其他細節非常重要,那麼爲什麼不將它們與原始問題一起提供?如果你不介意把所有缺少的上下文放到你原來的問題中,我可能會相應地調整我的其他非常通用的答案。另外, 你的'let drawList ...'在我的假設中沒有太大意義,因爲['List.iter:('T - > unit) - >'T list - > unit'](http:// msdn .microsoft.com/EN-US /庫/ ee340469.aspx)。 –

0
[list] |> List.filter (fun e -> (fst e) = "rectangle") |> List.iter actionRectangle 
[list] |> List.filter (fun e -> (fst e) = "ellipse") |> List.iter actionEllipse 
+0

一些解釋會讓奇觀:) – davidkonrad

+0

我同意戴維。我明白過濾器和iter對列表的作用,但我並不熟悉fun關鍵字,它是無窮無盡的功能。我猜(fst e)從列表中的項目e創建/獲取第一個值(分配給fst)?如果那是真的,爲什麼它會知道它會將第一個值賦給fst? –

+1

fst獲取元組的第一項。等於不分配,是平等檢查。有趣的是帶有一個參數的簡單lambda表達式。希望能幫助到你。 – Klark