Строки байтов Haskell: как сопоставить с образцом?

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

27
задан Cactus 16 January 2016 в 14:46
поделиться