升级 FParsec:升级受歧视的工会以满足新的平等/比较约束
-
21-09-2019 - |
题
所以,通过一个 你好拉尔io系列事件, ,我下载了 FParsec 源代码并尝试构建它。不幸的是,它与新的 1.9.9.9 不兼容。我解决了简单的问题,但有几个受歧视的工会仍然不起作用。
具体来说, 唐·赛姆的帖子 解释了包含类型项目的受歧视联合 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>) =
// some code ...
if top.OriginalOp <> op then false // requires equality constraint
// etc etc ...
或者,对于比较约束
let rec printMessages (pos: Pos) (msgs: ErrorMessage list) ind =
// other code ...
for msg in Set.ofList msgs do // iterate over ordered unique messages
// etc etc ...
据我所知,Don 用唯一的 int 标记每个实例的解决方案是实现自定义相等/比较约束的正确方法(或者可能是唯一的 int 元组,以便可以对 DU 的各个分支进行排序)。但这对于DU的用户来说是不方便的。现在,DU 的构建需要调用函数来获取下一个标记。
有没有某种方法可以隐藏标签获取并向库的用户提供相同的构造函数?即改变实现而不改变接口?这一点尤其重要,因为(根据我对代码的理解)看来 PrecedenceParserOp
是公共类型。
解决方案
您下载的 FParsec 来源是什么?我从 FParsec 获取了最新的 BitBucket存储库, ,而且我根本不需要对 FParsec 源代码进行任何更改即可在 VS 2010 RC 中进行编译。
编辑:我收回之前说过的话。我确实从 InterpLexYacc 和 InterpFParsec 示例项目中遇到了构建错误,但核心 FParsec 和 FParsecCS 项目构建得很好。
其他提示
有一件事情你可以做的是增加[<CustomEquality>]
和[<CustomComparison>]
属性和定义自己的.Equals
倍率和IComparable
实施。当然,这需要你自己处理的obj
和_ -> _
成分以适当的方式,可能会或可能是不可能的。如果你能控制什么东西被传递到OtherError
构造函数,你应该能够通过向下转换的ErrorMessage
一类是本身结构相媲美,使这项工作的obj
类型。然而,PrecendenceParserOp
情况下是有点麻烦 - 你也许能够使用的功能部件参考平等,只要你不必比较,以及获得由