Я новичок в Haskell, и с небольшим количеством проблем выясняю, как шаблон соответствует ByteString
. Версия моей функции [Char]
выглядит следующим образом:Haskell Bytestrings: Как сопоставить шаблон?
dropAB :: String -> String
dropAB [] = []
dropAB (x:[]) = x:[]
dropAB (x:y:xs) = if x=='a' && y=='b'
then dropAB xs
else x:(dropAB $ y:xs)
Как и ожидалось, это отфильтровывает все вхождения «AB» из строки. Тем не менее, у меня есть проблемы с попыткой применить это к ByteString
.
Наивная версия
dropR :: BS.ByteString -> BS.ByteString
dropR [] = []
dropR (x:[]) = [x]
<...>
дает
Couldn't match expected type `BS.ByteString'
against inferred type `[a]'
In the pattern: []
In the definition of `dropR': dropR [] = []
[]
явно преступник, как и для обычного String
а не ByteString
. Subbing в BS.empty
кажется правильным, но дает «Квалифицированное имя в позиции привязки: BS.пути». Оставляя нам попробовать
dropR :: BS.ByteString -> BS.ByteString
dropR empty = empty
dropR (x cons empty) = x cons empty
<...>
это дает «ошибка разбора в шаблоне» для (x cons empty)
. Я не знаю, что еще я могу сделать здесь.
В качестве побочного примечания, что я пытаюсь сделать с этой функцией, необходимо отфильтровать определенный символ UTF16 из некоторого текста. Если есть чистый способ добиться этого, я бы хотел его услышать, но эта ошибка совпадения с образцом кажется чем-то, что действительно должен понять новичок-хакеллер.
Я не уверен, но, может быть, охранники, а не образцы? –
Вы не можете отфильтровать символ UTF-16. Возможно, вы имели в виду «отфильтровать символ текста, который закодирован в UTF-16». – gawi