2016-04-01 57 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代碼塊支持大括號會很好。就像在符號的情況下一樣。我使用稍微不同的設置在幾臺機器上編碼,所以不得不依靠縮進來指定一些表達式並不是很好。 –