Inni już odpowiedział. Dodam tylko trochę wyjaśnienia.
Upraszczając nieco, reguła wcięcie Haskell jest:
- Niektóre słowa kluczowe uruchomić blok rzeczy (
where
, let
, do
, case ... of
).
- Znajdź pierwsze słowo po takich słowach kluczowych i zanotuj jego wcięcie. Nazwij kolumnę, w której występuje kolumna przestawna.
- Rozpocznij linię dokładnie na osi przestawnej, aby zdefiniować nowy wpis w bloku.
- Rozpocznij linię po osi przestawnej, aby kontynuować wpis rozpoczęty w poprzednich wierszach.
- Rozpocznij linię przed pivotem, aby zakończyć blok.
Stąd
where
wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs ++ "\n")
where
ls = lines input
ws = length words input
cs = length input
rzeczywistości oznacza
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
}
}
który traktuje drugą where
jako oddzielny określenia niezwiązanego z wordCount
. Jeśli przytoczymy więcej:
where {
wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs ++ "\n")
where { -- after the pivot, same entry
ls = lines input
;
ws = length words input
;
cs = length input
}
}
Niepowiązanie z "interakcją" praktycznie nigdy nie jest właściwym sposobem na wykonanie operacji we/wy w Haskell. – dfeuer
@dfeuer: nie ma nic złego w korzystaniu z 'interakcji' dla prostego" Po prostu chcę mieć tę funkcję Haskella w powłoce "-rind programów. Oczywiście "String" jest zawsze nieefektywny, ale dla wielu takich aplikacji zupełnie nie ma znaczenia. – leftaroundabout
@dfeuer Zgadzam się, właśnie robię to ćwiczenie z istniejącym szablonem z książki, nie osiągnąłem takiego poziomu wiedzy, jak w haskell, ale rozumiem dobry projekt, a głównie na późniejszych etapach książki. ucz się "właściwej drogi", dziękując za komentarz: – user1639848