sheet - haskell where multiple



Warum sollte ich Tabulatoren und Leerzeichen nicht mischen? (1)

Das Problem ist zweifach. Zunächst ist Haskell einrückungsempfindlich, z. B. ist der folgende Code nicht gültig:

example = (a, b)
  where
    a = "Hello"
     b = "World"

Beide Bindungen müssen mit der gleichen Anzahl von Leerzeichen / Tabulatoren eingerückt werden (siehe Abseitsregel ). Während es in diesem Fall offensichtlich ist, ist es in dem folgenden Fall eher verborgen, wo ich ein Leerzeichen mit · und einen Tabulator mit » :

example = (a, b)
··where
····a = "Hello"
»   b = "World"

Dies sieht nach gültigem Haskell-Code aus, wenn der Editor Registerkarten anzeigt, die auf Vielfache von Vier ausgerichtet sind. Ist es aber nicht. Haskell-Registerkarten werden durch ein Vielfaches von acht ausgerichtet, sodass der Code folgendermaßen interpretiert wird:

example = (a, b)
··where
····a = "Hello"
»       b = "World"

Zweitens, wenn Sie nur Tabulatoren verwenden, können Sie ein Layout erhalten, das nicht richtig aussieht. Der folgende Code sieht beispielsweise korrekt aus, wenn eine Registerkarte mit sechs oder mehr Leerzeichen angezeigt wird (in diesem Fall acht):

example = (a, b)
»       where»  a = "Hello"
»       »       b = "World"

Aber in einem anderen Editor, der 4 Leerzeichen verwendet, sieht es nicht mehr richtig aus:

example = (a, b)
»   where»  a = "Hello"
»   »   b = "World"

Es ist aber immer noch richtig. Jemand, der an Leerzeichen gewöhnt ist, kann jedoch die Bindung an Leerzeichen wiederholen und einen Parserfehler verursachen.

Wenn Sie im gesamten Code eine Code-Konvention durchsetzen, die sicherstellt, dass Sie nur Tabulatoren am Anfang einer Zeile und danach eine neue Zeile verwenden, können Sie einige der Probleme vermeiden (siehe 11 ). Aktuelle Versionen von GHC warnen jedoch standardmäßig vor Tabulatoren , da sie in der Vergangenheit many Parser-Fehler verursacht haben. Daher möchten Sie sie wahrscheinlich auch entfernen.

Siehe auch

Ich habe oft gelesen, dass ich Tabulatoren und Leerzeichen in Haskell nicht mischen sollte oder dass ich überhaupt keine Tabulatoren verwenden sollte. Warum?





indentation