FParsec で int32 を解析しようとしていますが、数値が最大値未満でなければならないという追加の制限があります。私自身のカスタムパーサー(以下のように)を書かずにこれを実行する方法ですか、および/または私のカスタムパーサー(以下)は要件を達成する適切な方法ですか。
組み込みライブラリ関数のほとんどは、特定の述語を満たすcharを中心に展開しているように見え、他の型ではないようです。
let pRow: Parser<int> =
let error = messageError ("int parsed larger than maxRows")
let mutable res = Reply(Error, error)
fun stream ->
let reply = pint32 stream
if reply.Status = Ok && reply.Result <= 1000000 then
res <- reply
res
アップデート
以下は、以下のコメントで与えられた方向に基づいた、より適切な FParsec ソリューションの試みです。
let pRow2: Parser<int> =
pint32 >>= (fun x -> if x <= 1048576 then (preturn x) else fail "int parsed larger than maxRows")
これは正しい方法ですか?