number - Data.Text vs String
text to cell matlab (5)
Hay al menos tres razones para usar [Char] en proyectos pequeños.
[Char]
no depende de ningún tipo de personal misterioso, como punteros externos, memoria sin procesar, matrices en bruto, etc. que pueden funcionar de manera diferente en diferentes plataformas o incluso no estar disponibles en conjunto.[Char]
es la lingua franka en haskell. Existen al menos tres formas "eficientes" de manejar datos unicode enutf8-bytestring
:utf8-bytestring
,Data.Text.Text
yData.Vector.Unboxed.Vector Char
, cada uno de los cuales requiere tratar con paquetes adicionales.al usar
[Char]
uno gana acceso a toda la potencia de[]
mónada, incluidas muchas funciones específicas (los paquetes de cuerdas alternativas intentan ayudar con eso, pero aún así)
Personalmente, considero que Data.Text basado en Data.Text
uno de los Data.Text
más cuestionables de la comunidad de haskell , ya que utf16 combina fallas de codificación utf8 y utf32 sin tener ninguno de sus beneficios.
Si bien la opinión general de la comunidad Haskell parece ser que siempre es mejor usar Text
lugar de String
, el hecho de que las API de la mayoría de las bibliotecas mantenidas estén orientadas a String
confunde. Por otro lado, hay proyectos notables , que consideran a String
como un error completo y proporcionan un Prelude
con todas las instancias de funciones orientadas a String
reemplazadas por sus equivalentes de Text
.
Entonces, ¿hay alguna razón para que las personas sigan escribiendo API orientadas a String
excepción de versiones anteriores y compatibles con Prelude estándar y la "intertia de creación de conmutadores"? ¿Hay posiblemente otros inconvenientes para Text
en comparación con String
?
Particularmente, estoy interesado en esto porque estoy diseñando una biblioteca y tratando de decidir qué tipo usar para expresar mensajes de error.
Me pregunto si Data.Text siempre es más eficiente que Data.String ???
"contras", por ejemplo, es O (1) para cadenas y O (n) para texto. Append es O (n) para Strings y O (n + m) para texto estricto. Igualmente,
let foo = "foo" ++ bigchunk
bar = "bar" ++ bigchunk
es más eficiente en el uso del espacio para cadenas que para textos estrictos.
Otro problema no relacionado con la eficiencia es la coincidencia de patrones (código perspicuo) y la pereza (predeciblemente por carácter en Strings, de alguna manera depende de la implementación en el texto vago).
Los textos son obviamente buenos para secuencias de personajes estáticos y para modificaciones en el lugar. Para otras formas de edición estructural, Data.String podría tener ventajas.
Mi conjetura no calificada es que la mayoría de los escritores de bibliotecas no desean agregar más dependencias de las necesarias. Como las cadenas son parte de, literalmente, todas las distribuciones de Haskell (¡es parte del estándar de lenguaje!), Es mucho más fácil ser adoptado si usa cadenas de caracteres y no requiere que los usuarios clasifiquen las distribuciones de texto del hackeo.
Es uno de esos "errores de diseño" con los que solo tienes que vivir a menos que puedas convencer a la mayoría de la comunidad para que cambie la noche. Basta con ver cuánto tiempo ha tardado en aplicar Applicative para que sea una superclase de Monad, un cambio relativamente menor pero muy deseado, e imagine cuánto tiempo llevaría reemplazar todas las cosas de String con Text.
Para responder a su pregunta más específica: me gustaría ir con String a menos que obtenga beneficios de rendimiento notables mediante el uso de texto. Los mensajes de error suelen ser bastante pequeños y únicos, por lo que no debería ser un gran problema usar String.
Por otro lado, si usted es el tipo de purista ideológico que evita el pragmatismo por idealismo, vaya con Texto.
* Pongo los errores de diseño en las comillas de susto porque las cadenas como una lista de caracteres es una propiedad ordenada que hace que sea fácil razonar e integrar con otras funciones operativas de listas existentes.
No creo que haya una sola razón técnica para que String permanezca. Y puedo ver varios para que vaya.
En general, primero diría que en el caso de Text / String solo hay una mejor solución:
Las interpretaciones de cuerdas son malas, todos están de acuerdo con eso
El texto no es difícil de usar. Todas las funciones comúnmente usadas en String están disponibles en Text, más algunas más útiles en el contexto de strings (sustitución, relleno, codificación)
tener dos soluciones crea complejidad innecesaria a menos que todas las funciones base se vuelvan polimórficas. Prueba: hay preguntas sobre el tema de las conversiones automáticas . Entonces este es un problema.
Entonces, una solución es menos compleja que dos, y las deficiencias de String la harán desaparecer eventualmente. Cuanto antes mejor !
Si su API está dirigida a procesar grandes cantidades de datos orientados a caracteres y / o varias codificaciones, su API debería usar Texto .
Si su API es principalmente para tratar cadenas cortas únicas, entonces usar el tipo de Cadena integrado debería estar bien.
Usar String para grandes cantidades de texto hará que las aplicaciones que usan su API consuman mucha más memoria. Usarlo con codificaciones extranjeras podría complicar seriamente el uso dependiendo de cómo funciona su API.
La cadena es bastante costosa (al menos 5N palabras donde N es el número de Char en la cadena). Una palabra tiene el mismo número de bits que la arquitectura del procesador (por ejemplo, 32 bits o 64 bits): http://blog.johantibell.com/2011/06/memory-footprints-of-some-common-data.html