私は 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
です。Subbing inBS.empty
は正しいことのように思えますが、「結合位置の修飾名: BS.empty」が表示されます。試してみましょう
dropR :: BS.ByteString -> BS.ByteString
dropR empty = empty
dropR (x cons empty) = x cons empty
<...>
これにより、 の「パターンの解析エラー」が発生します(x cons empty)
。ここで他に何ができるか本当にわかりません。
補足として、私がこの関数でやろうとしているのは、テキストから特定の UTF16 文字を除外することです。それを達成するためのきれいな方法があれば、私はそれを聞きたいと思っていますが、このパターンマッチングエラーは初心者の haskeller が本当に理解しておくべきもののようです.