Czy istnieje standardowy sposób dzielenia łańcucha w Haskell?
lines
i words
działa świetnie z dzieleniem na spację lub znak nowej linii, ale na pewno istnieje standardowy sposób dzielenia przecinkiem?
Nie mogłem go znaleźć w Hoogle.
Mówiąc konkretnie, szukam czegoś, co split "," "my,comma,separated,list"
wraca ["my","comma","separated","list"]
.
Data.List
lub nawetPrelude
. Jest tak powszechny i paskudny, jeśli nie jest dostępny dla golfa kodowego.Odpowiedzi:
Istnieje pakiet o nazwie split .
Użyj tego w ten sposób:
Zawiera wiele innych funkcji do dzielenia według pasujących separatorów lub posiadania kilku separatorów.
źródło
split
split
dobuild-depends
listy w swoim pliku cabal, np. Jeśli twój projekt nazywa się hello, to whello.cabal
pliku poniżejexecutable hello
linii umieść linię typu `build-depend: base, split` (zwróć uwagę na wcięcie dwóch spacji). Następnie zbuduj za pomocącabal build
polecenia. Por. haskell.org/cabal/users-guide/…Pamiętaj, że możesz sprawdzić definicję funkcji Prelude!
http://www.haskell.org/onlinereport/standard-prelude.html
Patrząc tam, definicja
words
jest,Więc zmień to na funkcję, która przyjmuje predykat:
Następnie nazwij to dowolnym predykatem, który chcesz!
źródło
Jeśli używasz Data.Text, istnieje splitOn:
http://hackage.haskell.org/packages/archive/text/0.11.2.0/doc/html/Data-Text.html#v:splitOn
Jest to wbudowane w platformę Haskell.
Na przykład:
lub:
źródło
text
pakietu lub go zainstalować. Jednak należałoby w innym pytaniu.W module Text.Regex (część Platformy Haskell) znajduje się funkcja:
który dzieli ciąg na podstawie wyrażenia regularnego. Interfejs API można znaleźć pod adresem Hackage .
źródło
Could not find module ‘Text.Regex’ Perhaps you meant Text.Read (from base-4.10.1.0)
Zastosowanie
Data.List.Split
, które wykorzystujesplit
:źródło
Spróbuj tego:
Działa tylko dla jednego znaku, ale powinien być łatwo rozszerzalny.
źródło
Bez importowania czegokolwiek po prostym zastąpieniu jednego znaku spacją, separatorem docelowym dla
words
jest spacja. Coś jak:lub
Możesz zrobić z tego funkcję z parametrami. Możesz wyeliminować parametr znak, aby dopasować moje pasujące wiele, na przykład:
źródło
Na przykład
Pojedynczy ogranicznik końcowy zostanie usunięty:
źródło
Zacząłem się uczyć Haskella wczoraj, więc popraw mnie, jeśli się mylę, ale:
daje:
a może chciałeś
co byłoby:
źródło
split
, rozpieszczanego przez języki z dobrze rozwiniętymi bibliotekami. Ale i tak dzięki.Nie wiem, jak dodać komentarz do odpowiedzi Steve'a, ale chciałbym polecić
dokumentację bibliotek GHC ,
a w niej konkretnie funkcje listy
podrzędnej w Data.List
Co jest o wiele lepsze jako odniesienie, niż zwykłe czytanie raportu Haskella.
Ogólnie rzecz biorąc, fałd z regułą określającą, kiedy utworzyć nową podlistę do karmienia, powinien również rozwiązać ten problem.
źródło
Oprócz wydajnych i gotowych funkcji podanych w odpowiedziach dodam własne, które są po prostu częścią mojego repertuaru funkcji Haskell, które pisałem, aby nauczyć się języka w swoim czasie:
Rozwiązania są co najmniej rekurencyjne, więc nie powodują przepełnienia stosu.
źródło
Przykład w ghci:
źródło
ghci
?Łatwiej mi to zrozumieć:
źródło