私は今この少しsoccer gameを書いています、そして、最初からバグがあることが1つあります。ゲームはYampa Arcadeのパターンに従うので、「オブジェクト」のサムタイプは、ゲーム中にあります:タイプチェッカーで私を助けてくれますか?タイプファミリーで、多分?
data ObjState = Ball Id Pos Velo
| Player Id Team Number Pos Velo
| Game Id Score
オブジェクトがメッセージに反応するので、別の合計の種類があります:
data Msg = BallMsg BM
| PlayerMsg PM
| GameMsg GM
data BM = Gained | Lost
data PM = GoTo Position | Shoot
data GM = GoalScored | BallOutOfBounds
ヤンパフレームワークが依存しているがいわゆる信号機能について説明する。私たちの場合、ボール、プレーヤ、ゲームの動作のための信号関数があります。大幅に簡略化:
ballObj, playerObj, gameObj :: (Time -> (GameInput, [Msg]))
-> (Time -> (ObjState, [(Id, Msg)]))
ballObjは、ゲームインプット(キーストローク、ゲーム状態など)を生成する関数と、特定の時間にボールのメッセージのリストを取得し、ボールの状態を返す関数を返し、他のオブジェクト(ボール、ゲーム、選手)を選ぶことができます。
ballObj, playerObj, gameObj :: SF (GameInput, [Msg]) (ObjState, [(Id, Msg)])
この均一な型シグネチャは、ヤンパフレームワークのために重要である:(再び、非常に大雑把に単純化された)、それは11 + 11のリストから大きな信号機能を構築ヤンパでは、型シグネチャは、実際には少し立派に見えます(プレイヤー)+ 1(ボール)+ 1(ゲーム)の信号機能が同じタイプ(dpSwitch経由)で実行されます(反応します)。
これで、どのようなバグですか?BallMsgをボールに、またはPlayerMsgをプレーヤに送信するだけです。誰かがGameMsgをBallに送ると、プログラムがクラッシュします。これを避けるために型チェッカーを入手する方法はありませんか?私は最近、タイプファミリーについてのこの素晴らしいPokemon投稿を読んでいます。それはいくつかの類推のようです。だから、多分これが出発点であるかもしれない:
今class Receiver a where
Msg a :: *
putAddress :: Msg a -> a -> Msg a
data BallObj = ...
data GameObj = ...
data PlayerObj = ...
instance Receiver BallObj where
Msg BallObj = Gained | Lost
(...)
、SFの機能は、次のようになります。
forall b . (Receiver a, Receiver b) => SF (GameInput, [Msg a]) (a, [(b, Msg b)])
これはどこでも私を得るのだろうか?
リラックス。 Haskellプログラムはタイプエラーのためクラッシュすることはありません(安全でないコードや外部コードを使用しない限り)。問題を示す作業コードがありますか? –
メッセージを処理する関数内の非網羅的なパターンのためにクラッシュします。 – martingw
ああ、その種のクラッシュ。 –