作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
跟进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"]
我需要用什么来代替上面代码段中的 ????我如何检查它是一个数字,而不是一个运算符等?
最佳答案
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
关于f# - 如何从 F# 列表中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4704878/
我是一名优秀的程序员,十分优秀!