预期的类型开关类型取决于注释[榆木]

时间:2014-12-15 15:54:45

标签: types elm

我有一个编译问题,其中期望的类型有时是{},有时候是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都是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

1 个答案:

答案 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

修好了。