2

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
4

1 に答える 1