2016-03-28 5 views
3

私はFParsecを使用しており、結果の値をFSIの変数にバインドしようとしています。私は次のように試してみました:FParsec結果値をFSIの変数に抽出する方法

 > run pint32 "3";; // succeeds 
     val it : ParserResult<int32,unit> = Success: 3 
     > let x = run pint32 "3";; 
     val x : ParserResult<int32,unit> = Success: 3 
     > x;; // I bind the result to x 
     val it : ParserResult<int32,unit> = Success: 3 
     > let Success(y, _, _) = x;; //It looks like I can extract the value... 
     val Success : y:'a * 'b * 'c -> ParserResult<int32,unit> 
     > y;; 
     ...error FS0039: The value or constructor 'y' is not defined 

以下の非構造が動作するので、結合し、それを忘れているようだが、私は、私は何かが欠けてると仮定します。

> type AB = A of int | B 
let aa = A 1 
let A a = aa;; 

type AB = 
    | A of int 
    | B 
val aa : AB = A 1 
val A : a:'a -> AB 
> a;; 
val it : int = 1 

そして、以下の機能ができそうです私は何を誤解してい

> let extract p str = 
     match run p str with 
     | Success(result, _, _) -> result 
     | Failure(errorMsg, _, _) -> 3 
let z = extract pint32 "3" 
z;; 

val extract : p:Parser<int,unit> -> str:string -> int 
val z : int = 3 
val it : int = 3 

:(Iは、障害の種類に応じて、パーサを変更する必要があると思いますが)一致ステートメントを使用して値を抽出するには?

答えて

5

あなたはこの最近の問題と同じ問題がヒットしている:

F#: Destructuring bind with a discriminated union

をごlet Success(y, _, _) = xラインは、実際には、パラメータとして単一の3タプルを取るSuccessという名前の関数を作成しています。あなたがする必要があるのはlet (Success(y, _, _)) = xです。

関連する問題