gpt4 book ai didi

f# - FParsec 无法识别类型的构造函数

转载 作者:行者123 更新时间:2023-12-04 08:21:50 25 4
gpt4 key购买 nike

以下顶级 XML 解析器定义返回错误 The value or constructor ‘TOP_LEVEL_RECORD’ is not defined.

let xTop_Level, xTop_Level_Ref = createParserForwardedToRef<TOP_LEVEL_RECORD, unit>()

do xTop_Level_Ref :=
pipe4
(opt xDeclaration)
(opt (many xComment_or_CData))
xElement
(opt (many xComment_or_CData))
(fun decl before_root root after_root
-> {Declaration = decl
Before_Root = before_root
Root = root
After_Root = after_root}) |>> TOP_LEVEL_RECORD
// This returns the error -------------------→^^^^^^^^^^^^^^^^
TOP_LEVEL_RECORD被定义为……
type TOP_LEVEL_RECORD = {Declaration : XDECLARATION option
Before_Root : COMMENTS_OR_CDATA list option
Root : XELEMENT
After_Root : COMMENTS_OR_CDATA list option
}
解析器 xDeclaration , xCommentor_Cdata , 和 xElement都正确定义并返回 TOP_LEVEL_RECORD 中的相应类型. let xTop_Level, xTop_Level_Ref = createParserForwardedToRef<TOP_LEVEL_RECORD, unit>()是在这里记录的递归解析器调用的 Fparsec 语法: http://www.quanttec.com/fparsec/tutorial.html#parsing-json.createParserForwardedToRef-example .
如果我定义类型 type TOP_LEVEL = TOP_LEVEL_TYPE of TOP_LEVEL_RECORD并替换 TOP_LEVEL_RECORDTOP_LEVELTOP_LEVEL_TYPE如下 …
let xTop_Level, xTop_Level_Ref = createParserForwardedToRef<TOP_LEVEL, unit>()
// Replaced this text ------------------------------------->^^^^^^^^^

do xTop_Level_Ref :=
pipe4
(opt xDeclaration)
(opt (many xComment_or_CData))
xElement
(opt (many xComment_or_CData))
(fun decl before_root root after_root
-> {Declaration = decl
Before_Root = before_root
Root = root
After_Root = after_root}) |>> TOP_LEVEL_TYPE
// Replaced this text ----------------------->^^^^^^^^^^^^^^
...代码编译时没有任何错误或警告。
为什么 TOP_LEVEL_TYPE这里有一个构造函数而不是 TOP_LEVEL_RECORD ?
你能指出 F# 或 FParsec 文档的相关部分吗?

最佳答案

TOP_LEVEL_RECORD (记录类型)和 TOP_LEVEL (联合类型)是类型名称,不能用作构造函数。
构建一个 TOP_LEVEL_RECORD您使用代码中的语法

{ Declaration = decl
Before_Root = before_root
Root = root
After_Root = after_root }
要构造联合类型的实例,您可以使用案例名称之一作为构造函数; TOP_LEVEL_TYPE在你的情况下,因为只有一个工会案例。
请注意,在您的类型定义中
type TOP_LEVEL = TOP_LEVEL_TYPE of TOP_LEVEL_RECORD
TOP_LEVEL是一种类型,但 TOP_LEVEL_TYPE (尽管它的名字)不是类型,而是 TOP_LEVEL 的构造函数类型。
所以记录类型没有命名构造函数,但联合类型有。
对于您的代码,您可以跳过 |>> TOP_LEVEL_RECORD部分。
您可以在 F# language spec 中阅读有关记录类型和联合类型的信息。 ,第 8.4 和 8.5 节。

关于f# - FParsec 无法识别类型的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65460209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com