Soy un novato Haskell, y tengo algunos problemas para encontrar la forma de un patrón que coincida con ByteString
. La versión [Char]
de mi función será similar a:Bytestrings Haskell: ¿Cómo se empareja el patrón?
dropAB :: String -> String
dropAB [] = []
dropAB (x:[]) = x:[]
dropAB (x:y:xs) = if x=='a' && y=='b'
then dropAB xs
else x:(dropAB $ y:xs)
Como era de esperar, este filtra todas las ocurrencias de "ab" de una cadena. Sin embargo, tengo problemas para intentar aplicar esto a un ByteString
.
La versión ingenua
dropR :: BS.ByteString -> BS.ByteString
dropR [] = []
dropR (x:[]) = [x]
<...>
produce
Couldn't match expected type `BS.ByteString'
against inferred type `[a]'
In the pattern: []
In the definition of `dropR': dropR [] = []
[]
es claramente el culpable, como lo es para un habitual String
no un ByteString
. Subbing en BS.empty
parece lo correcto, pero da "Nombre calificado en la posición de enlace: BS.empty". dejándonos a tratar
dropR :: BS.ByteString -> BS.ByteString
dropR empty = empty
dropR (x cons empty) = x cons empty
<...>
esto da "Error de análisis en el patrón" para (x cons empty)
. Realmente no sé qué más puedo hacer aquí.
Como nota al margen, lo que intento hacer con esta función es filtrar un carácter UTF16 específico de algún texto. Si hay una manera limpia de lograr eso, me encantaría escucharlo, pero este error de coincidencia de patrones parece algo que un novato debe entender realmente.
No estoy seguro, pero tal vez guardias en lugar de coincidencia de patrones? –
No se puede filtrar un carácter UTF-16. Quizás quisiste decir "filtrar un carácter de un texto codificado en UTF-16". – gawi