そのようなコンビネータはありません。存在する場合は、Text.Parsec.Char(関連するすべての標準パーサーコンビネーター関数Charが定義されている場所)にあります。かなり簡単に定義できるはずです。
ただし、アトパーセクがその実装で行うのと同じパフォーマンス上の利点を得ることができるとは思いません。FastSetこれは、8ビット文字でのみ機能する内部型に依存しています。もちろん、Unicodeサポートが必要ない場合、それは問題ではないかもしれませんが、のコードはFastSet、より大きい文字を渡すと予測できない結果が得られることを意味します。'\255'したがって、ベースのソリューションを再利用する場合は、次のようになりFastSetます。少なくとも、バイナリモードで解析している文字列を読み取る必要があります。FastSet(エクスポートされないため、の実装をプログラムにコピーする必要もあります...)
範囲文字列が短い場合、このような単純なソリューションはかなり高速になる可能性があります。
type Range = (Char, Char)
inClass :: String -> Char -> Bool
inClass = inClass' . parseClass
parseClass :: String -> [Range]
parseClass "" = []
parseClass (a:'-':b:xs) = (a, b) : parseClass xs
parseClass (x:xs) = (x, x) : parseClass xs
inClass' :: [Range] -> Char -> Bool
inClass' cls c = any (\(a,b) -> c >= a && c <= b) cls
このようなものを試すこともできます。これは、少なくとも上記のバージョンと同じくらい効率的である必要があり(単一の呼び出しが多数行われる場合を含む)inClass s、さらにリストトラバーサルのオーバーヘッドを回避できます。
inClass :: String -> Char -> Bool
inClass "" = const False
inClass (a:'-':b:xs) = \c -> (c >= a && c <= b) || f c where f = inClass xs
inClass (x:xs) = \c -> c == x || f c where f = inClass xs
(ラムダから再帰を移動するように注意してください。GHCがこれを自分で実行できるかどうかはわかりません。)