Apakah ada cara standar untuk membagi string di Haskell?
lines
dan words
bekerja dengan baik dari pemisahan pada ruang atau baris baru, tetapi pasti ada cara standar untuk membagi pada koma?
Saya tidak dapat menemukannya di Hoogle.
Untuk lebih spesifik, saya mencari sesuatu di mana split "," "my,comma,separated,list"
kembali ["my","comma","separated","list"]
.
Data.List
atau bahkanPrelude
. Ini sangat umum dan tidak menyenangkan jika tidak tersedia untuk kode-golf.Jawaban:
Ada paket untuk split yang disebut ini .
Gunakan seperti ini:
Muncul dengan banyak fungsi lain untuk membelah pada pembatas yang cocok atau memiliki beberapa pembatas.
sumber
split
fungsi tunggal yang akan menjawab setiap kebutuhan, Anda benar-benar membutuhkan paket semacam itu.split
kebuild-depends
daftar di file cabal Anda, mis. Jika proyek Anda dipanggil halo, maka dalamhello.cabal
file di bawahexecutable hello
baris beri garis seperti `build-depend: base, split` (catat dua spasi indent). Kemudian bangun menggunakancabal build
perintah. Lih haskell.org/cabal/users-guide/…Ingatlah bahwa Anda dapat mencari definisi fungsi Prelude!
http://www.haskell.org/onlinereport/standard-prelude.html
Melihat di sana, definisi dari
words
adalah,Jadi, ubah untuk fungsi yang mengambil predikat:
Kemudian menyebutnya dengan predikat apa pun yang Anda inginkan!
sumber
Jika Anda menggunakan Data.Text, ada splitOn:
http://hackage.haskell.org/packages/archive/text/0.11.2.0/doc/html/Data-Text.html#v:splitOn
Ini dibangun di Platform Haskell.
Jadi misalnya:
atau:
sumber
text
paket atau menginstalnya. Akan termasuk dalam pertanyaan lain.Dalam modul Text.Regex (bagian dari Platform Haskell), ada fungsi:
yang membagi string berdasarkan pada ekspresi reguler. API dapat ditemukan di Hackage .
sumber
Could not find module ‘Text.Regex’ Perhaps you meant Text.Read (from base-4.10.1.0)
Gunakan
Data.List.Split
, yang menggunakansplit
:sumber
Coba yang ini:
Hanya bekerja untuk satu karakter, tetapi harus mudah diperpanjang.
sumber
Tanpa mengimpor apa pun pengganti langsung dari satu karakter untuk spasi, pemisah target
words
adalah spasi. Sesuatu seperti:atau
Anda dapat menjadikan ini sebagai fungsi dengan parameter. Anda dapat menghilangkan parameter -to-match parameter saya yang cocok banyak, seperti di:
sumber
Misalnya
Pembatas trailing tunggal akan dijatuhkan:
sumber
Saya mulai belajar Haskell kemarin, jadi koreksi saya jika saya salah tetapi:
memberi:
atau mungkin Anda inginkan
yang akan menjadi:
sumber
split
, dimanjakan oleh bahasa dengan perpustakaan yang berkembang dengan baik. Tapi Terimakasih.Saya tidak tahu bagaimana cara menambahkan komentar pada jawaban Steve, tetapi saya ingin merekomendasikan
dokumentasi perpustakaan GHC ,
dan di sana secara khusus
fungsi Sublist di Data.List
Yang jauh lebih baik sebagai referensi, daripada hanya membaca laporan Haskell biasa.
Secara umum, lipatan dengan aturan kapan membuat sublist baru untuk diumpankan, harus menyelesaikannya juga.
sumber
Selain fungsi efisien dan pra-dibangun yang diberikan dalam jawaban saya akan menambahkan sendiri yang hanya bagian dari perbendaharaan fungsi Haskell yang saya tulis untuk mempelajari bahasa pada waktu saya sendiri:
Solusi setidaknya rekursif ekor sehingga mereka tidak akan menyebabkan stack overflow.
sumber
Contoh dalam ghci:
sumber
ghci
?Saya menemukan ini lebih mudah untuk dipahami:
sumber