Tôi là người mới sử dụng Haskell và gặp một chút rắc rối khi tìm ra cách tạo mẫu khớp với ByteString
. Phiên bản [Char]
của chức năng của tôi trông giống như:Haskell Bytestrings: Cách so khớp mẫu?
dropAB :: String -> String
dropAB [] = []
dropAB (x:[]) = x:[]
dropAB (x:y:xs) = if x=='a' && y=='b'
then dropAB xs
else x:(dropAB $ y:xs)
Như mong đợi, điều này lọc ra tất cả các lần xuất hiện của "ab" từ một chuỗi. Tuy nhiên, tôi gặp sự cố khi cố gắng áp dụng điều này cho một số ByteString
.
Phiên bản ngây thơ
dropR :: BS.ByteString -> BS.ByteString
dropR [] = []
dropR (x:[]) = [x]
<...>
mang
Couldn't match expected type `BS.ByteString'
against inferred type `[a]'
In the pattern: []
In the definition of `dropR': dropR [] = []
[]
rõ ràng là thủ phạm, vì nó là một thường xuyên String
không phải là một ByteString
. Subbing trong BS.empty
có vẻ như là điều đúng nhưng cung cấp cho "Tên đủ điều kiện ở vị trí ràng buộc: BS.empty." Để chúng tôi thử
dropR :: BS.ByteString -> BS.ByteString
dropR empty = empty
dropR (x cons empty) = x cons empty
<...>
điều này cho phép "phân tích lỗi trong mẫu" cho (x cons empty)
. Tôi thực sự không biết mình có thể làm gì khác ở đây.
Lưu ý phụ, những gì tôi đang cố gắng làm với chức năng này là lọc ra một ký tự UTF16 cụ thể từ một số văn bản. Nếu có một cách sạch sẽ để thực hiện điều đó, tôi rất muốn nghe nó, nhưng lỗi kết hợp mẫu này có vẻ giống như một cái gì đó mà một người mới bắt đầu phải thực sự hiểu.
Tôi không chắc chắn, nhưng có thể bảo vệ hơn là khớp mẫu? –
Bạn không thể lọc ra một ký tự UTF-16. Có lẽ bạn có nghĩa là "lọc ra một ký tự của một văn bản được mã hóa bằng UTF-16". – gawi