Я новичок Haskell и немного разобрался в том, как сопоставить шаблон с ByteString
. Версия моей функции [Char]
выглядит так:
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
не a ByteString
. Subbing в BS.empty
кажется правильным, но дает "Квалифицированное имя в позиции привязки: BS.empty". Оставив нас попробовать
dropR :: BS.ByteString -> BS.ByteString
dropR empty = empty
dropR (x cons empty) = x cons empty
<...>
это дает "ошибку разбора в шаблоне" для (x cons empty)
. Я не знаю, что еще я могу сделать здесь.
В качестве побочного примечания, что я пытаюсь сделать с этой функцией, нужно отфильтровать определенный символ UTF16 из некоторого текста. Если есть чистый способ добиться этого, я бы с удовольствием это услышал, но эта ошибка совпадения с образцом кажется чем-то, что действительно должен понять новичок-хакеллер.