2016-04-01 18 views
3

bekam Ich stecken auf die Codierung der wichtigsten SF für ein Mario wie Spiel, das ich zum Spaß schreibe. Hier ist der Code, der nicht analysieren:"parse Fehler bei der Eingabe '<-'" in einem Yampa-Programm

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 

Und das ist der Code, der analysiert und führt 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 

Bitte beachte, dass ich mit Kommentaren beiden Versionen in dem gleichen Code-Block erhalten zu machen Der Unterschied ist sichtbarer.

Im Prinzip möchte ich eine negative Rückkopplungsschleife mit einer kleinen Verzögerung erzeugen, so dass ich das umgewandelte Spiel umgehen kann und keine Funktionen wechseln muss. Der Ausgang geht auf einen „zeichnen“ SF wie folgt aus:

mainSF = parseInput >>> master_combine >>> draw 

In der ersten Version i versuchen Zwischen Namen gs zu verwenden (Spielzustand) und GDs (verzögerte Spielzustand). Der Fehler wird in der Zeile angezeigt, die mit dgs beginnt.

In der zweiten Version, die für mich funktioniert, musste ich den gesamten SF in einer Zeile schreiben.

Ich möchte die erste Version des Codes verwenden, weil ich die Funktionalität erweitern muss, indem ich zusätzliche SFs verbinde, die negative Rückkopplungsschleifen implizieren.

Ich suche nach Hilfe auf Rec in Arrow "Do" Notation und ich finde immer die gleichen Beispiele, die richtigen Code Einrückung betonen. Aber ich ziehe mit Sublime ein und der Abstand sieht für mich gut aus. Gibt es eine andere Art und Weise ? Klammern, geschweifte Klammern? Etwas?

+0

' Rec gs <- .. 'und' dgs <- .. sollten in derselben Spalte beginnen. Das ist * die * Einrückungsregel - alles in einem "Block" beginnt in derselben Spalte. Und das erste syntaktische Element des Blocks bestimmt, wie hoch der Eindruck sein soll. Nebenbei, ja, Sie können geschweifte Klammern verwenden, um Einrückungsprobleme zu vermeiden - 'do \ n x \ n y' wird zu' do {x; y} '. – user2407038

+0

@ user2407038: Er möchte 'dgs' in der Definition von' gs' verwenden, was bedeutet, dass er seine Definition innerhalb des 'rec' braucht. –

Antwort

3

Ich merke, dass Sie Tabs verwenden. Ich nehme an, Ihre Tabs sind auf 4 Felder gesetzt? Haskell's Tabs sind immer auf 8 Leerzeichen gesetzt. Ändern Sie entweder die Tabulatoreinstellungen in Sublime auf 8 Leerzeichen oder setzen Sie Sublime, um Tabulatoren in Leerzeichen zu erweitern, und es sollte funktionieren.

(Natürlich müssen Sie die Registerkarte vor dgs zu vier Leerzeichen in beide Richtungen ändern).

Eine weitere Option ist eine neue Zeile zu setzen (und Gedankenstrich) nach rec, in welchem ​​Fall es keine Rolle, welche Länge Ihrer Tabs sind (da Sie konsistent über die Verwendung von Tabs zu sein):

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

Epischer Sieg! Danke, Mann. Wäre schön, geschweifte Klammern Unterstützung für Rec-Code-Blöcke zu haben. Wie im Fall der Do Notation. Ich code auf ein paar Maschinen mit etwas anderen Einstellungen, so dass man sich auf die Einrückung verlassen muss, um einen Ausdruck zu spezifizieren, ist nicht sehr nett. –

Verwandte Themen