Я новичок в 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
, а не ByteString
. Подстановка в BS.empty
кажется правильной, но дает «Полное имя в позиции привязки: BS.empty». Оставив нас, чтобы попробовать
dropR :: BS.ByteString -> BS.ByteString
dropR empty = empty
dropR (x cons empty) = x cons empty
<...>
это дает «ошибку синтаксического анализа в шаблоне» для (x cons empty)
. Я действительно не знаю, что еще я могу сделать здесь.
В качестве примечания: то, что я пытаюсь сделать с помощью этой функции, - это отфильтровать определенный символ UTF16 из некоторого текста. Если есть чистый способ сделать это, я был бы рад услышать об этом, но эта ошибка сопоставления с образцом кажется чем-то, что действительно должен понять начинающий хаскелер.
ByteString
, как если бы это был связанный список. В этом случаеdecodeUtf16LE
иText.filter
(/= '消')
являются более чистыми высокоуровневыми инструментами. для достижения того, что пытается сделать LOS. Какой бы случай не привел вас к этому вопросу, у него может быть похожее решение! - person Lynn   schedule 26.03.2019