Andere haben bereits beantwortet. Ich werde nur etwas mehr Erklärung hinzufügen.
Vereinfachen ein wenig, die Haskell Einbuchtung Regel lautet:
- Einige Schlüsselwörter beginnen einen Block von Dingen (
where
, let
, do
, case ... of
).
- Suchen Sie das erste Wort nach solchen Schlüsselwörtern und notieren Sie den Einzug. Benennen Sie die Spalte, in der die Pivot-Spalte auftritt.
- Starten Sie eine Linie genau auf dem Drehpunkt, um einen neuen Eintrag im Block zu definieren.
- Starten Sie eine Linie nach dem Drehpunkt, um den in den vorherigen Zeilen begonnenen Eintrag fortzusetzen.
- Eine Zeile vor dem Drehpunkt beginnen, um den Block zu beenden. Daher
,
where
wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs ++ "\n")
where
ls = lines input
ws = length words input
cs = length input
bedeutet eigentlich
where {
wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs ++ "\n")
;
where { -- same column, new entry
ls = lines input
; -- same column, new entry
ws = length words input
; -- same column, new entry
cs = length input
}
}
die den zweiten where
als separate Definition in keinem Zusammenhang mit wordCount
behandelt. Wenn wir es mehr einrücken:
where {
wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs ++ "\n")
where { -- after the pivot, same entry
ls = lines input
;
ws = length words input
;
cs = length input
}
}
Unabhängig davon ist "interagieren" praktisch nie der richtige Weg, um I/O in Haskell zu tun. – dfeuer
@dfeuer: es ist nichts falsch daran, 'interact' für simple" Ich möchte nur diese Haskell-Funktion in der Shell haben "-Kind von Programmen. Natürlich ist 'String' immer ineffizient, aber für viele solcher Anwendungen ist das völlig egal. – leftaroundabout
@dfeuer Ich stimme zu, ich mache nur diese Übung mit dem vorhandenen Text aus dem Buch, ich habe nicht die Art von Know-how erreicht, die Sie in Haskell haben, aber ich verstehe gutes Design und vor allem in späteren Phasen des Buches werde ich lerne den "richtigen Weg" danke für den Kommentar obwohl – user1639848