3

我一直在为我正在写的一款马里奥之类的游戏编写主要的 SF。这是不解析的代码:

master_combine = proc pi -> do 
                            -- rec cgg <- player_update >>> (initial_game --> bounds_updater) >>> iPre initial_game -< (pi, cgg)
                            rec gs  <- player_update >>> (initial_game --> bounds_updater) -< (pi, dgs)
                                dgs <- iPre initial_game -< gs
                            returnA -< gs

这是解析和执行正常的代码:

master_combine = proc pi -> do 
                            rec cgg <- player_update >>> (initial_game --> bounds_updater) >>> iPre initial_game -< (pi, cgg)
                            -- rec gs  <- player_update >>> (initial_game --> bounds_updater) -< (pi, dgs)
                            --  dgs <- iPre initial_game -< gs
                            returnA -< cgg

请注意,我在同一个代码块中保留了两个版本并带有注释,以使差异更加明显。

原则上,我想创建一个带有小延迟的负反馈循环,这样我就可以传递转换后的游戏而不必切换功能。输出到这样的“绘制”SF:

mainSF = parseInput >>> master_combine >>> draw

在第一个版本中,我尝试使用中间名称 gs(游戏状态)和 dgs(延迟游戏状态)。错误在以 dgs 开头的行上发出信号。

在适合我的第二个版本中,我必须将整个 SF 写在一行中。

我想使用代码的第一个版本,因为我需要通过连接暗示负反馈循环的附加 SF 来扩展功能。

我一直在用箭头“do”表示法寻找关于 rec 的帮助,我总是找到强调正确代码缩进的相同示例。但我用 Sublime 缩进,间距对我来说很好。还有其他方法吗?括号,大括号?任何事物?

4

1 回答 1

3

我注意到您正在使用标签。我猜你的标签设置为4个空格?Haskell 的制表符总是设置为 8 个空格。要么将 Sublime 中的选项卡设置更改为 8 个空格,要么将 Sublime 设置为将选项卡扩展到空格,它应该可以工作。

(显然,dgs无论哪种方式,您都必须将之前的制表符更改为四个空格)。

另一种选择是在 之后添加换行符(和缩进)rec,在这种情况下,标签的长度无关紧要(因为您在使用标签时保持一致):

master_combine = proc pi -> do 
                            -- rec cgg <- player_update >>> (initial_game --> bounds_updater) >>> iPre initial_game -< (pi, cgg)
                            rec
                                gs  <- player_update >>> (initial_game --> bounds_updater) -< (pi, dgs)
                                dgs <- iPre initial_game -< gs
                            returnA -< gs
于 2016-04-01T20:28:39.290 回答