2016-04-01 28 views
3

我被困在编写一个马里奥的主SF上,就像我写作的乐趣一样。 这里是不解析代码:在一个Yampa程序中输入'< - '“时出现”解析错误“

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 

这是一个分析和执行OK代码:

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来扩展功能。

我一直在Arrow“do”表示法中搜索rec的帮助,我总是发现强调正确代码缩进的相同示例。但是我缩进Sublime,间距对我来说看起来很好。有另一种方法吗?括号,大括号?什么?

+0

' rec gs < - ..'和'dgs < - ..'应该从同一列开始。这是*缩进规则 - “块”中的所有内容都始于同一列。而块的第一个语法元素决定了缩进级别应该是什么。顺便说一句,是的,你可以使用花括号来避免缩进问题 - 'do \ n x \ n y'变成'do {x; y}'。 – user2407038

+0

@ user2407038:他想在'gs'的定义中使用'dgs',这意味着他需要将其定义放在'rec'中。 –

回答

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 
+0

史诗般的胜利!谢啦。对于rec代码块支持大括号会很好。就像在符号的情况下一样。我使用稍微不同的设置在几台机器上编码,所以不得不依靠缩进来指定一些表达式并不是很好。 –