2016-03-28 7 views
2

私は、次の種類、(いくつかの不必要な詳細をeliding)タイプタグイディオムイムを削除していますか?

type alias Mover = 
    { x : Int 
    , y : Int 
    } 


type Piece 
    = Enemy Mover 
    | Player Mover 

を作成しましたそして、私は彼らに

enemy : Int -> Int -> Piece 
enemy x y = 
    Enemy { x = x, y = y } 


player : Int -> Int -> Piece 
player x y = 
    Player { x = x, y = y } 

を作成するために、これらの関数を使用しかし、私は自分自身が私ができる前に、この機能を使用することを見つけます実際にそれらを使用してください...

toMover : Piece -> Mover 
toMover piece = 
    case piece of 
    Enemy mover -> 
     mover 

    Player mover -> 
     mover 

...それはやや厄介なようです。これは私がこれを行うことになっている方法ですか、私は自分で物事を難しくしていますか?私はPlayerを同じリストにいくつかのEnemyのインスタンスとしておくことができ、時にはそれらの違いを伝えることができるようにしたいが、toMoverを呼び出さずに両方のタイプ(サブタイプ?)で動作する関数を書くことができるようにしたい。毎回。

答えて

2

違ったモデルを:

type alias Mover = 
    { x : Int 
    , y : Int 
    , kind : Kind 
    } 


type Kind = Enemy | Player 

enemy1 = Mover 0 0 Enemy -- these are shortcuts to item creation 
player1 = Mover 2 2 Player 

enemy x y = Mover x y Enemy -- if you prefer functions 

player x y = Mover x y Player 
関連する問題