我有一个编译问题,其中期望的类型有时是{},有时候是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
都是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
所以我的问题是,为什么我在使用时不希望游戏类型作为函数返回值:
stepGame : Input -> Game -> Game
答案 0 :(得分:1)
游戏类型期待变量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
修好了。