我有一个编译问题,预期类型有时是 {} 有时是 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。检查这个和之前的编译错误,我推断出返回值是正确的,但不知何故,它期望函数什么都不返回,而它应该期望一个游戏类型的返回值。
所以我尝试将注释更改为:
stepGame : Input -> Game -> Game -> Int
这正确地给出了:
Expected Type: Main.Game -> Int
Actual Type: Main.Game
所以我的问题是,为什么在我使用时它不期望 Game 类型作为函数返回值:
stepGame : Input -> Game -> Game