serial - Texto o Bytestring
python string to bytestring (3)
Buen día.
Lo único que ahora odio de Haskell es la cantidad de paquetes para trabajar con cuerdas.
Primero utilicé cadenas nativas de Haskell [Char]
, pero cuando traté de comenzar a usar bibliotecas de pirateo, perdí por completo en infinitas conversiones. Cada paquete parece usar una implementación de cadenas diferente, algunos adoptan su propia cosa hecha a mano.
A continuación, reescribí mi código con Data.Text
cadenas de texto Data.Text
y OverloadedStrings
, elegí Text
porque tiene un conjunto más amplio de funciones, pero parece que muchos proyectos prefieren ByteString
.
¿Alguien podría explicar brevemente por qué usar uno u otro?
PD: ¿por qué cómo convertir de Text
a ByteString
?
No se pudo hacer coincidir el tipo esperado Data.ByteString.Lazy.Internal.ByteString con el tipo inferido Texto Tipo esperado: IO Data.ByteString.Lazy.Internal.ByteString Tipo inferido: IO Text
encodeUtf8
desde Data.Text.Encoding
, pero no Data.Text.Encoding
suerte:
No se pudo hacer coincidir el tipo esperado Data.ByteString.Lazy.Internal.ByteString con el tipo inferido Data.ByteString.Internal.ByteString
UPD:
Gracias por las respuestas, que * La bondad de los trozos parece que es un camino por recorrer, pero algo conmocionado con el resultado, mi función original se veía así:
htmlToItems :: Text -> [Item]
htmlToItems =
getItems . parseTags . convertFuzzy Discard "CP1251" "UTF8"
Y ahora se convirtió en:
htmlToItems :: Text -> [Item]
htmlToItems =
getItems . parseTags . fromLazyBS . convertFuzzy Discard "CP1251" "UTF8" . toLazyBS
where
toLazyBS t = fromChunks [encodeUtf8 t]
fromLazyBS t = decodeUtf8 $ intercalate "" $ toChunks t
Y sí, esta función no funciona porque está mal, si le proporcionamos Text
, entonces estamos seguros de que este texto está codificado y listo para usar y convertirlo es una estupidez, pero una conversión tan detallada todavía tiene que ser tener lugar en algún lugar fuera de htmltoItems
.
Definitivamente desea utilizar Data.Text para datos textuales.
encodeUtf8
es el camino a seguir. Este error:
No se pudo hacer coincidir el tipo esperado Data.ByteString.Lazy.Internal.ByteString con el tipo inferido Data.ByteString.Internal.ByteString
significa que está suministrando una cadena de bytes estricta al código que espera una cadena de bytes perezosa . La conversión es fácil con la función fromChunks
:
Data.ByteString.Lazy.fromChunks :: [Data.ByteString.Internal.ByteString] -> ByteString
así que todo lo que necesita hacer es agregar la función fromChunks [myStrictByteString]
donde se espera la lazy bytestring.
La conversión a la inversa se puede lograr con la función dual de toChunks
, que toma una cadena de bytes lenta y proporciona una lista de fragmentos estrictos.
Es posible que desee preguntarle a los mantenedores de algunos paquetes si podrían proporcionar una interfaz de texto en lugar de, o además de, una interfaz de cadena de bytes.
Use una sola función cs
de Data.String.Conversions
.
Le permitirá convertir entre String
, ByteString
y Text
(así como ByteString.Lazy
y Text.Lazy
), dependiendo de la entrada y los tipos esperados.
Aún debe llamarlo, pero ya no debe preocuparse por los tipos respectivos.
Vea esta respuesta para el ejemplo de uso.
ByteStrings
son principalmente útiles para datos binarios, pero también son una forma eficiente de procesar texto si todo lo que necesita es el conjunto de caracteres ASCII. Si necesita manejar cadenas Unicode, necesita usar Text
. Sin embargo, debo enfatizar que ninguno es un reemplazo para el otro, generalmente se usan para cosas diferentes: mientras que el Text
representa unicode puro, aún necesita codificar desde y hacia una representación ByteString
binaria siempre que, por ejemplo, transporte texto a través de un socket o un archivo.
Aquí hay un buen artículo sobre los conceptos básicos de Unicode, que hace un trabajo decente al explicar la relación de los puntos de código Unicode ( Text
) y los bytes binarios codificados ( ByteString
): el mínimo absoluto que todo desarrollador de software debe saber absolutamente sobre Unicode y juegos de caracteres
Puede utilizar el módulo Data.Text.Encoding para convertir entre los dos tipos de datos, o Data.Text.Lazy.Encoding si está utilizando las variantes perezosas (como parece estar haciendo en función de sus mensajes de error).