質問

フォローアップ 私の前の質問, 、私はゆっくりと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"]

私は自分の代わりに何をする必要がありますか ??? 上のスニペットで?そして、オペレーターなどではなく、それが数字であることを確認するにはどうすればよいですか?

役に立ちましたか?

解決

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top