4

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")

これは正しい方法ですか?

4

1 に答える 1