跟进 我以前的问题, ,我正在慢慢地掌握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#类型的列表,则使用 =, ,当类型具有相同的长度并包含具有相同属性的元素时,它将返回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