gpt4 book ai didi

parsing - FParsec 和 pipeline3 使参数显式或添加类型符号

转载 作者:行者123 更新时间:2023-12-02 16:49:04 25 4
gpt4 key购买 nike

我正在尝试使用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 不带参数)。阅读链接的文档页面以获取完整的说明 - 我不会复制并粘贴整个内容 - 但简短的版本是您可以执行以下两项操作之一:

  1. 创建一个如下所示的 test 函数,并确保在解析器的同一源文件中使用它:

    let test p str =
    match run p str with
    | Success(result, _, _) -> printfn "Success: %A" result
    | Failure(errorMsg, _, _) -> printfn "Failure: %s" errorMsg
  2. 使用如下所示的类型注释来注释您的解析器:

    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/

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