2

我有一个编译问题,预期类型有时是 {} 有时是 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

两者都是游戏类型defaultGamegame所以我觉得这很奇怪。如果我stepGame从以下位置更改注释:

stepGame : Input -> Game -> Game 

至:

stepGame : Input -> Game -> Int

它将给出以下编译错误:

Expected Type: Int
  Actual Type: Main.Game

这是预期的和正确的。返回值是 Game 类型,但在我的注释中,我希望是 Int。检查这个和之前的编译错误,我推断出返回值是正确的,但不知何故,它期望函数什么都不返回,而它应该期望一个游戏类型的返回值。

所以我尝试将注释更改为:

stepGame : Input -> Game -> Game -> Int

这正确地给出了:

Expected Type: Main.Game -> Int
  Actual Type: Main.Game

所以我的问题是,为什么在我使用时它不期望 Game 类型作为函数返回值:

stepGame : Input -> Game -> Game
4

1 回答 1

1

Game 的类型需要变量 state、player1、player2、player3 和 player4。在我的论点中,stepGame我将它们简称为 p1、p2、p3 和 p4。这是不允许的。所以:

stepGame : Input -> Game -> Game 
stepGame {space,delta,so1,so2,so3,so4}
         ({state,player1,player2,player3,player4} as game) = -- stuff

解决它。

于 2014-12-16T18:28:27.090 回答