Turtle
モジュールのメソッドに構文ツリーをコンパイルしたい。ラムダのツリーと弁別されたユニオンのツリー
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
を持って
module Turtle =
let rotateDefaultAmount amount state = ...
let move vector state = ...
このオプションは、コードの重複(実際にはより多くのコマンドがあります)を生成します。それは他のコマンドに依存します。特に、の後にを実行し、それぞれmove
コマンドを使用して占有位置に移動しないようにする必要があります。また、ツリーの中にコマンドmove
を続けてはいけません。
moveAndEvadeCollision
の後にmove
が付いていないという方法を書くことはできません。すべてが区別できないので、TurtleState -> TurtleState
ラムダです。私の最初のリファクタリングが間違っていて、私は重複に戻るべきですか?関数型言語のプログラムは、関数からなるデータ構造を持つのが普通ですか?