Sementara pendapat umum dari Haskell masyarakat tampaknya bahwa itu's selalu lebih baik untuk menggunakan Teks
bukan String
, fakta bahwa masih Api dari sebagian besar dipertahankan perpustakaan String
yang berorientasi membingungkan neraka keluar dari saya. Di sisi lain, ada proyek penting, yang menganggap String
sebagai sebuah kesalahan sama sekali dan memberikan Prelude
dengan semua contoh dari String
yang berorientasi pada fungsi diganti dengan Teks
-rekan.
Jadi apa ada alasan bagi orang untuk terus menulis String
Api yang berorientasi kecuali mundur - dan standar Prelude-kompatibilitas dan "switch-membuat intertia"?
Apakah ada kemungkinan lain kelemahan Teks
dibandingkan dengan String
?
Terutama, saya'm tertarik dalam hal ini karena saya'm merancang perpustakaan dan mencoba untuk memutuskan jenis yang digunakan untuk menyampaikan pesan-pesan kesalahan.
Saya kira wajar tanpa pengecualian adalah bahwa sebagian besar perpustakaan penulis don't ingin menambahkan lebih banyak dependensi dari yang diperlukan. Karena string adalah bagian dari harfiah setiap Haskell distribusi (it's bagian dari bahasa standar!), hal ini jauh lebih mudah untuk mendapatkan diadopsi jika anda menggunakan string dan don't membutuhkan pengguna untuk memilah-milah Teks distribusi dari hackage.
It's salah satu dari mereka "kesalahan desain" anda hanya harus hidup dengan kecuali jika anda dapat meyakinkan sebagian besar masyarakat untuk beralih malam. Lihat saja berapa lama telah diambil untuk mendapatkan Aplikatif untuk menjadi superclass dari Monad – yang relatif kecil tapi banyak yang menginginkan perubahan dan bayangkan berapa lama itu akan mengambil untuk mengganti semua String hal-hal dengan Teks.
Untuk menjawab pertanyaan yang lebih spesifik: saya akan pergi dengan String kecuali anda mendapatkan kinerja yang nyata manfaat dengan menggunakan Teks. Pesan kesalahan ini biasanya lebih kecil satu dari hal-hal jadi seharusnya't menjadi masalah besar untuk menggunakan String.
Di sisi lain, jika anda adalah semacam ideologi murni yang eschews pragmatisme untuk idealisme, pergi dengan Teks.
* Aku menaruh kesalahan desain dalam menakut-nakuti tanda kutip karena string sebagai sebuah daftar dari karakter yang rapi properti yang membuat mereka mudah untuk mencari alasan dan mengintegrasikan dengan lainnya ada daftar-fungsi operasi.
Jika anda API ditargetkan pada pengolahan sejumlah besar karakter yang berorientasi pada data dan/atau berbagai pengkodean, maka API anda harus menggunakan **Teks.
Jika API anda terutama untuk berurusan dengan satu-off string, kemudian menggunakan built-in String jenis harus baik-baik saja.
Menggunakan String untuk jumlah besar dari teks akan membuat aplikasi yang menggunakan API anda mengkonsumsi secara signifikan lebih banyak memori. Menggunakannya dengan asing pengkodean serius bisa mempersulit penggunaan tergantung pada bagaimana anda API bekerja.
String ini cukup mahal (setidaknya 5N kata-kata di mana N adalah jumlah Karakter dalam String). Kata-kata adalah sama dengan jumlah bit sebagai arsitektur prosesor (ex. 32 bit atau 64 bit): http://blog.johantibell.com/2011/06/memory-footprints-of-some-common-data.html
Setidaknya ada tiga alasan untuk menggunakan [Char] di proyek-proyek kecil.
[Char]
tidak bergantung pada setiap arcane staf, seperti asing pointer, baku memori, baku array, dll yang dapat bekerja secara berbeda pada platform yang berbeda atau bahkan tidak tersedia sama sekali
[Char]
adalah lingua franka di haskell. Setidaknya ada tiga 'efisien' cara-cara untuk menangani data unicode di haskell: utf8-bytestring
, Data.Teks.Teks
dan Data.Vektor.Tanpa box.Vektor Char
, masing-masing membutuhkan berurusan dengan tambahan paket.
dengan menggunakan [Char]
satu keuntungan akses ke semua kekuatan []
monad, termasuk banyak fungsi-fungsi tertentu (alternatif string paket jangan mencoba untuk membantu dengan itu, tapi masih)
Secara pribadi, saya menganggap utf16berbasis Data.Teks` salah satu yang paling dipertanyakan semua keputusan dari haskell masyarakat, karena utf16 menggabungkan kekurangan dari kedua utf8 dan utf32 encoding sementara memiliki tidak ada manfaatnya.
Saya tidak berpikir ada satu alasan teknis untuk String yang tetap. Dan aku bisa melihat beberapa orang untuk itu untuk pergi.
Secara keseluruhan saya akan pertama berpendapat bahwa dalam Teks/String kasus hanya ada satu solusi terbaik :
Teks ini tidak sulit untuk digunakan. Semua fungsi-fungsi yang sering digunakan pada String yang tersedia pada Teks, ditambah beberapa lagi dalam konteks string (substitusi, padding, encoding)
Sehingga salah satu solusinya adalah lebih kompleks dari dua, dan kekurangan dari String akan hilang pada akhirnya. Lebih cepat lebih baik !
Aku bertanya-tanya apakah Data.Teks selalu lebih efisien daripada Data.String???
"karena ... " misalnya adalah O(1) untuk String dan O(n) untuk Teks. Append adalah O(n) untuk String dan O(n+m) untuk ketat Teks's. Demikian juga,
let foo = "foo" ++ bigchunk
bar = "bar" ++ bigchunk
adalah ruang yang lebih efisien untuk String daripada ketat Teks.
Masalah lain yang tidak berhubungan dengan efisiensi adalah pencocokan pola (dipahami code) dan lazyness (bisa ditebak per-karakter dalam String, entah bagaimana implementasi tergantung pada malas Teks).
Teks's yang jelas baik untuk karakter statis urutan dan untuk di-tempat modifikasi. Untuk bentuk-bentuk lain dari struktur editing, Data.String mungkin memiliki keuntungan.