function の注釈をどのように変更するかによって、予想される型が {} の場合もあれば Game の場合もあるというコンパイルの問題がありますstepGame
。
data State = Start | Play | End
type Game = { state:State, player1:Snake, player2:Snake, player3:Snake,
player4:Snake }
defaultGame : Game
defaultGame = -- stuff (returns Game type with default values)
stepGame : Input -> Game -> Game
stepGame {space,delta,so1,so2,so3,so4}
({state,p1,p2,p3,p4} as game) =
let state' = -- stuff
p1' = -- stuff
p2' = -- stuff
p3' = -- stuff
p4' = -- stuff
in case state' of
Start -> if space then defaultGame else game
Play -> { game | state <- state'
, p1 <- p1'
, p2 <- p2'
, p3 <- p3'
, p4 <- p4' }
End -> if space then defaultGame
else { game | state <- state' }
変数に何が起こるか、入力が正確に何であるかは、実際には問題ではありません。これを実行すると、次のようになります。
Expected Type: {}
Actual Type: Main.Game
defaultGame
とはどちらもgame
ゲーム型なので、これは変だと思いました。stepGame
注釈を次のように変更した場合:
stepGame : Input -> Game -> Game
に:
stepGame : Input -> Game -> Int
次のコンパイルエラーが発生します。
Expected Type: Int
Actual Type: Main.Game
これは予期されたものであり、正しいものです。戻り値は Game 型ですが、私の注釈では Int が必要です。これと以前のコンパイル エラーを調べて、戻り値は正しいと推測しましたが、どういうわけか、関数が何も返さないことを期待していましたが、Game タイプの戻り値を期待しているはずです。
そこで、注釈を次のように変更しようとしました。
stepGame : Input -> Game -> Game -> Int
これは正しく与えます:
Expected Type: Main.Game -> Int
Actual Type: Main.Game
だから私の質問は、私が使用するときに関数の戻り値として Game タイプを期待しないのはなぜですか?
stepGame : Input -> Game -> Game