Mam problemy ze zrozumieniem działania tej funkcji. Funkcja ma przyjmować ciąg znaków i rozdzielać ten ciąg na parę, której pierwszy element jest pierwszym "słowem" w łańcuchu, a drugi element jest pozostałością łańcucha wejściowego.Problemy ze zrozumieniem działania rekursji krotki w Haskell
W szczególności, w linii 6, rozumiem, dlaczego funkcja powinna kończyć się, gdy isSpace c
jest prawdziwa, ale nie rozumiem, dlaczego powinna ona zwrócić krotkę z pierwszym elementem będącym pustą listą. Zastanawiałem się, czy ktoś mógłby wyjaśnić, dlaczego działa to przy stosunkowo prostym (ale nietrywialnym) przykładzie, takim jak nextWord "an apple"
.
import Data.Char
nextWord :: String -> (String, String)
nextWord []
= ([],[])
nextWord (c:cs)
| isSpace c = ([], cs)
| otherwise = (c: word, other)
where
(word, other) = nextWord cs
EDIT: Jako przykład tego, co ta funkcja zwraca kiedy dany spór zaczyna się od miejsca, nextWord „cześć” powinien powrócić („”, „hello”).
„dlatego, że należy powrócić krotki z pierwszą element będący pustą listą ". Co powinien jednak zwrócić? –
Czy możesz zapisać tę wartość w Haskell? –
To nie jest rekursja krotki. Jest to funkcja rekurencyjna zwracająca krotkę. W przypadku typu "spac" zwraca pustą listę jako pierwszy składnik: jest to właściwie pusty ciąg.Dzieje się tak, aby wywołanie rekurencyjne mogło dodać znaki przed tym, aby wyizolować pierwsze słowo w łańcuchu wejściowym. – chi