Я новичок в 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 пусто)
. Я действительно не знаю, что еще я могу здесь сделать.
В качестве примечания, что я m пытается сделать с этой функцией, чтобы отфильтровать определенный символ UTF16 из некоторого текста. Если есть чистый способ сделать это, я бы хотел его услышать, но эта ошибка сопоставления с образцом кажется чем-то, что действительно должен понять начинающий хаскеллер.