【问题标题】:How to extract data from F# list如何从 F# 列表中提取数据
【发布时间】:2011-01-16 19:51:12
【问题描述】:

在my previous question 之后,我正在慢慢掌握 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", ???) 

以交互方式,当我执行 parse "1" 时,响应是:

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

通过调整有效运算符列表,我可以运行 parse "1+1" 来获得:

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

在上面的 sn-p 中,我需要用什么代替我的 ????以及如何检查它是数字,而不是运算符等?

【问题讨论】:

    标签: f# fparsec


    【解决方案1】:

    F# 类型(包括列表)实现结构相等。这意味着,如果您使用= 比较包含某些 F# 类型的两个列表,则当类型具有相同长度并包含具有相同属性的元素时,它将返回 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多