2009-02-13 72 views
1

好的。我沒有要求plssendcodezkthx。但是我對FP有點新,我想弄清楚如何做到這一點,因爲我知道我有的代碼不會實現我想實現的目標。所以,關於優化的所有論點,這裏是我的代碼然後我會解釋。F#地帶麻煩地圖

let moveBoids boids = 
    boids |> List.map (fun(boid) -> 
     let others = List.filter (fun(b) -> b.Id <> boid.Id) boids 
     let positions = others |> List.map(fun(b2) -> b2.Position) 
     let velocities = others |> List.map(fun(b3) -> b3.Velocity) 
     let c = centerWithFlock (boid, positions) 
     let d = distanceFromFlock (boid, positions) 
     let v = matchVelocityWithFlock (boid, velocities) 
     let v2 = List.fold_right (addVector) [c; d; v] {X=0.; Y=0.; Z=0.} 
     let p = addVector boid.Position v2 
     {boid with Position=p; Velocity=v2}) 

我試圖將我的boid列表映射到一個新的boid列表。聽起來很容易,除非我非常肯定,如果我運行這個,每個boid只會根據原始列表更改,而不是每個boid更新自身的列表。我該怎麼用地圖樣式調用來做到這一點?我是否應該使用地圖樣式調用?我知道我的功能在我的boids列表中關閉,那麼如何將更新的列表傳遞給下一個電話?

單詞。

+1

正確表達plz向德codez kthx – JoelFan 2010-02-15 22:00:16

回答

2

我想這可能修復它..

let rec foo boids newboids = 
    match boids with 
    | h :: t -> 
     let others = List.filter (fun(b) -> b.Id <> h.Id) newboids 
     let positions = others |> List.map(fun(b2) -> b2.Position) 
     let velocities = others |> List.map(fun(b3) -> b3.Velocity) 
     let c = centerWithFlock (h, positions) 
     let d = distanceFromFlock (h, positions) 
     let v = matchVelocityWithFlock (h, velocities) 
     let v2 = List.fold_right (addVector) [c; d; v] {X=0.; Y=0.; Z=0.} 
     let p = addVector h.Position v2 
     let list = [{h with Position=p; Velocity=v2}] @ others 
     foo t list 
    | [] -> newboids 
2

呀,地圖似乎並不太好了這個......你可以用摺疊做到這一點(在那裏你積累「新聞」爲你處理'olds'並將'others'計算爲'news'+非me'olds'),或者你可以轉換爲一個數組並使用一個循環來就地更新(然後在需要時完成轉換回列表)。

2

這是一個有趣的問題 - 您發佈的解決方案看起來不錯,但我只是想知道(預留問題)爲什麼你需要考慮到以前的更改在加工過程中?即使有這種行爲,在該列表將不會反映在後面的處理做了改變,第一BOID ...

它使一個很大的區別計算是否使用更新後的狀態,而不是原來的?

感謝, T.

+0

「名單」的頭是每個迭代更新BOID,不是嗎?所以這會反映?我正在嘗試在F#和WPF中進行「Boids」模擬。這三個對我來說都是新的,聽起來很有趣。但我會想象,如果每個boid只重映射到舊數據,而不是更新... – 2009-02-13 14:19:07