Parsing 解包嵌套的应用函子f#

Parsing 解包嵌套的应用函子f#,parsing,parser-combinators,Parsing,Parser Combinators,嗨,我正在尝试制作一个combinator解析器,目前我正在尝试让它读取头并根据解析的头创建解析器。即一个标题;int、float、string将导致解析器 然而,我想知道你将如何解包“内部”解析器,然后以类似的方式结束解析器? 解析器类型是:type Parser)我不确定您使用嵌套解析器的想法是否可行-如果动态解析标头,则需要生成相同类型的解析器列表。您编写这篇文章的方式表明解析器的类型将取决于输入,这在F#中是不可能的 因此,我希望您需要定义如下值: type Value = Int of

嗨,我正在尝试制作一个combinator解析器,目前我正在尝试让它读取头并根据解析的头创建解析器。即一个标题;int、float、string将导致
解析器

然而,我想知道你将如何解包“内部”解析器,然后以类似的方式结束<代码>解析器?


解析器类型是:
type Parser)

我不确定您使用嵌套解析器的想法是否可行-如果动态解析标头,则需要生成相同类型的解析器列表。您编写这篇文章的方式表明解析器的类型将取决于输入,这在F#中是不可能的

因此,我希望您需要定义如下值:

type Value = Int of int | String of string | Float of float
然后,解析头的解析器将生成如下内容:

let parseHeaders args : Parser<Parser<Value> list> = (...)
这需要一个分隔符(比如,识别逗号的解析器)和一个解析器列表,并生成一个解析器,该解析器按顺序运行所有解析器,分隔符位于两者之间

然后你可以做:

parseHeaders input |> map (fun parsers -> sequence (char ',') parsers)
您可以得到一个解析器
解析器
。现在,您希望在运行外部解析器后剩下的部分上运行嵌套解析器,外部解析器识别头。以下函数实现了这一功能:

let unwrap (Parser f:Parser<Parser<'a>>) = Parser (fun s ->
  match f s with
  | Result.Ok(Parser nested, rest) -> nested rest 
  | Result.Error e -> Result.Error e )

让展开(解析器f:Parser@Simplexity我认为这最好作为另一个问题问——我不确定你的意思,我认为我们不能在评论中有意义地澄清这一点。
let unwrap (Parser f:Parser<Parser<'a>>) = Parser (fun s ->
  match f s with
  | Result.Ok(Parser nested, rest) -> nested rest 
  | Result.Error e -> Result.Error e )