Ich bin ein Haskell-Neuling und habe ein bisschen Mühe herauszufinden, wie man eine ByteString
gemusterte passt. Die [Char]
Version meiner Funktion wie folgt aussieht:Haskell Bytestrings: Wie Muster passen?
dropAB :: String -> String
dropAB [] = []
dropAB (x:[]) = x:[]
dropAB (x:y:xs) = if x=='a' && y=='b'
then dropAB xs
else x:(dropAB $ y:xs)
Wie erwartet, diese filtert alle Vorkommen von „ab“ aus einem String. Allerdings habe ich Probleme, dies auf eine ByteString
anzuwenden.
Die naive Version
dropR :: BS.ByteString -> BS.ByteString
dropR [] = []
dropR (x:[]) = [x]
<...>
ergibt
Couldn't match expected type `BS.ByteString'
against inferred type `[a]'
In the pattern: []
In the definition of `dropR': dropR [] = []
[]
eindeutig der Schuldige ist, wie es für eine regelmäßige String
kein ByteString
ist. Subbing in BS.empty
scheint wie das Richtige, aber gibt "qualifizierten Namen in der Bindungsposition: BS.empty." Verlassen uns
dropR :: BS.ByteString -> BS.ByteString
dropR empty = empty
dropR (x cons empty) = x cons empty
<...>
dieses „analysieren Fehler im Muster“ für (x cons empty)
gibt zu versuchen. Ich weiß nicht wirklich, was ich hier noch tun kann.
Als eine Randnotiz versuche ich mit dieser Funktion ein bestimmtes UTF16-Zeichen aus einem Text herauszufiltern. Wenn es einen sauberen Weg gibt, dies zu erreichen, würde ich es gerne hören, aber dieser Muster-Übereinstimmungs-Fehler scheint etwas zu sein, was ein Neuling Hasenkeller wirklich verstehen sollte.
Ich bin mir nicht sicher, aber vielleicht eher Wachen als Mustervergleich? –
Sie können kein UTF-16-Zeichen ausfiltern. Vielleicht meintest du "filtere einen Charakter eines Textes aus, der in UTF-16 kodiert ist". – gawi