- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用pipe3
函数来自 FParsec
库,但我收到一个错误,我不知道如何解决。
鉴于记录
type Point = { x: float; y: float }
和下面的解析器
let plistoffloats' =
pipe3 pfloat (pchar ',' .>> spaces) pfloat
(fun first z second -> { x = first; y = second })
我试图实现的是一个解析器,它接收格式为 "1.1, 3.7"
的字符串。并返回 Point
run plistoffloats' "1.1, 3.7"
输入:"1.1, 3.7"
所需输出:Point = {x = 1.1; y = 3.7;}
错误:
error FS0030: Value restriction. The value 'plistoffloats'' has been inferred to have generic type val plistoffloats' :
Parser <Point,'__a>
Either make the arguments to 'plistoffloats'' explicit or, if you do not intend for it to be generic, add a type annotation.一个更简单的例子
pchar
也没用。let parsesA = pchar 'a'
error FS0030: Value restriction. The value 'parsesA' has been inferred to have generic type val parsesA :
Parser<char,'_a>
Either make the arguments to 'parsesA' explicit or, if you do not intend for it to be generic, add a type annotation.
最佳答案
这在 FParsec documentation 中有介绍;任何解析器都会发生这种情况。原因是因为在 .Net 类型系统中,函数允许是泛型的,但值则不允许 - 并且在 FParsec 中,您通常将解析器定义为值(例如,您通常编写 let psomething = ...
,其中 psomething
不带参数)。阅读链接的文档页面以获取完整的说明 - 我不会复制并粘贴整个内容 - 但简短的版本是您可以执行以下两项操作之一:
创建一个如下所示的 test
函数,并确保在解析器的同一源文件中使用它:
let test p str =
match run p str with
| Success(result, _, _) -> printfn "Success: %A" result
| Failure(errorMsg, _, _) -> printfn "Failure: %s" errorMsg
使用如下所示的类型注释来注释您的解析器:
type UserState = unit // You might change this later
let plistoffloats' : Parser<_, UserState> =
// ...
听起来您正在尝试执行 #1 操作,但除非在同一源文件中使用 test plistoffloats'
调用解析器,否则 F# 类型推断将无法推断您的用户状态类型,并会给出该错误.
附注您可以在此处阅读有关 F# 值限制错误的更多信息:Understanding F# Value Restriction Errors
P.P.S。 _
第一个位置中的 Parser<_, UserState>
并不意味着“此类型可以是任何类型”,而 _
在其他上下文(如模式匹配)中的含义则不同。相反,类型注释中的 _
表示“请为我推断此类型,以便我不必显式指定它”。在 FParsec 上下文中,这非常有用,因为所有解析器都将 UserState
作为其第二类型参数,但第一个类型参数将具有不同的类型。由于第一个类型参数是类型推断可以推断的类型参数,这意味着您可以将类型 Parser<_, UserState>
复制并粘贴到所有解析器,并且 F# 在每种情况下都会执行正确的操作™。
关于parsing - FParsec 和 pipeline3 使参数显式或添加类型符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54536779/
我是一名优秀的程序员,十分优秀!