2011-01-16 6 views
3

my previous questionをフォローアップして、FParsecのハングアップをぼんやりしています。F#リストからデータを抽出するには

私の次の初心者の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"] 

私は私のの場所に置くために何が必要ですか?上記のスニペットの?そして、オペレータなどではなく、番号であることをどのようにチェックするのですか?

答えて

7

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

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

あなたが平等自分で実装したい場合は、:

Element型はF#(およびオブジェクトタイプではありません)で定義された判別組合であると仮定すると、あなただけ書くことができるはずですパターンマッチングを使うことができます。

let expected = [Number "1"] 
match interim, expected with 
| Number a, Number b when a = b -> true 
| _ -> false 
関連する問題