0

我正在尝试使用Sprache制作解析器, 我正在使用 F#。我见过的所有关于该库的示例都使用 Linq 查询语法。我尝试使用“查询”计算表达式将 linq 转换为 f#,但我迷路了。

这是我一直在使用的示例。

[TestClass]
public class tests
{
    [TestMethod]
    public void test()
    {
        var input = "\"this is text\"";
        var content = Class1.Quoted.Parse(input);
        Assert.AreEqual("this is text", content);
    }
}
public class Class1
{
    public static readonly Parser<string> Quoted =
        (from open in Parse.Char('"')
         from content in Parse.CharExcept('"').Many().Text()
         from close in Parse.Char('"')
         select content);

    public static readonly Parser<string> Quoted2 =
        Parse.Char('"').SelectMany(open => 
        Parse.CharExcept('"').Many().Text(), ())
}

显而易见的方法是将 linq 转换为方法调用,但我不知道该怎么做。我尝试查看 ILSpy,但这让我有点困惑。

Linq 查询如何看起来像直接方法调用?

4

1 回答 1

0

翻译你的例子

(from open in Parse.Char('"')
from content in Parse.CharExcept('"').Many().Text()
from close in Parse.Char('"')
select content);

(Parse.Char('"')
.SelectMany(open => Parse.CharExcept('"').Many().Text(), (open, content) => new {open, content})
.SelectMany(@t => Parse.Char('"'), (@t, close) => @t.content));

注意:采用更习惯于 F# 的方法可能会很棘手,因为计算表达式似乎没有与 C# LINQ 语法被预编译到的 SelectMany 的重载等效(以及 Sprache 提供的)。

于 2015-07-30T17:40:45.413 回答