所以,由
hi
lar
ious series of events
,我下载了fparsec源并尝试构建它。不幸的是,它与新的1.9.9.9不兼容。我解决了一些简单的问题,但仍有一些受到歧视的工会不起作用。
明确地,
Don Syme's post
解释包含类型为的项的有区别的联合
obj
或
->
不要自动获得相等或比较约束,因为对象不支持比较,函数也不支持相等。(不清楚自动生成的相等/比较以前是否有问题,但是代码甚至不会编译,因为它们不再生成。)
以下是有问题的DU的一些示例:
type PrecedenceParserOp<'a,'u'> =
| PrefixOp of string * Parser<unit,'u> * int * bool * ('a -> 'a)
| others ...
type ErrorMessage =
| ...
| OtherError of obj
| ...
以下是违规使用:
member t.RemoveOperator (op: PrecedenceParserOp<'a, 'u>) =
if top.OriginalOp <> op then false
或者,对于比较约束
let rec printMessages (pos: Pos) (msgs: ErrorMessage list) ind =
for msg in Set.ofList msgs do
据我所知,Don用唯一int标记每个实例的解决方案是实现自定义相等/比较约束(或者可能是唯一int tuple,以便可以对du的各个分支进行排序)的正确方法。但这对du的用户来说是不方便的。现在,du的构造需要调用一个函数来获取下一个图章。
是否有某种方法可以隐藏获取标签,并将相同的构造函数呈现给库的用户?也就是说,在不更改接口的情况下更改实现?这一点尤其重要,因为(根据我对代码的理解)它似乎
PrecedenceParserOp
是公共类型。