我想編譯一個語法樹到Turtle
模塊的方法。lambdas樹與歧視工會的樹
module Turtle =
let rotateDefaultAmount amount state = ...
let move vector state = ...
該選項生成代碼重複(實際上有多個命令):
type TurtleCommand =
| Rotate of float32
| Move of Vector2
/...
match symbol with
| 'w' -> Move (Vector2.up)
| '\' -> Rotate 90.0f
//...
let applyCommand command state =
match command with
| Move shift -> Turtle.move shift state
| Rotate amount -> Turtle.rotate amount state
applyCommand command someState
我這個替代它:
type TurtleCommand = TurtleState -> TurtleState
/...
match symbol with
| 'w' -> Turtle.move (Vector2.up)
| '\' -> Turtle.rotate 90.0f
//...
command someState
現在我有一個命令Turtle.moveAndEvadeCollision
。這取決於其他命令。特別是應在各move
指令後執行,以確保不會進入佔用位置。另外,不應該在樹中使用move
命令。
我不能寫一個方法驗證,moveAndEvadeCollision
後面沒有move
因爲它們都是不可區分的TurtleState -> TurtleState
lambda。這是否意味着我的第一次重構是錯誤的,我應該返回重複?一個功能語言的程序是否正常,有一個由功能組成的數據結構?