3

前の質問に続いて、私はゆっくりとFParsecのコツをつかんでいます(私は特に理解するのが難しいと思いますが)。

次の初心者のF#の質問は、パーサーが作成するリストからデータを抽出するにはどうすればよいですか?

たとえば、前の質問のサンプルコードをParser.fsというモジュールにロードし、別のモジュールに非常に単純な単体テストを追加しました(適切な参照を使用)。XUnitを使用しています:

open Xunit

[<Fact>]
let Parse_1_ShouldReturnListContaining1 () =
    let interim = Parser.parse("1")
    Assert.False(List.isEmpty(interim))

    let head = interim.Head // I realise that I have only one item in the list this time
    Assert.Equal("1", ???) 

インタラクティブに、解析「1」を実行すると、応答は次のようになります。

val it : Element list = [Number "1"]

有効な演算子のリストを微調整することで、解析「1+1」を実行して以下を取得できます。

val it : Element list = [Number "1"; Operator "+"; Number "1"]

私の代わりに何を置く必要がありますか?上記のスニペットで?また、演算子などではなく、数値であることを確認するにはどうすればよいですか?

4

1 に答える 1

7

F#タイプ(リストを含む)は、構造的な同等性を実装します。つまり、を使用していくつかのF#タイプを含む2つのリストを比較すると=、タイプの長さが同じで、同じプロパティの要素が含まれている場合にtrueが返されます。

ElementタイプがF#で定義された識別された共用体である(そしてオブジェクトタイプではない)と仮定すると、次のように書くことができるはずです。

Assert.Equal(interim, [Number "1"; Operator "+"; Number "1"])

自分で等式を実装したい場合は、パターンマッチングを使用できます。

let expected = [Number "1"]
match interim, expected with
| Number a, Number b when a = b -> true
| _ -> false
于 2011-01-16T11:51:12.190 に答える