为什么我要使用即将到来的 let!... 和!句法?

Che*_*vas 5 monads f# applicative

语言的建议指出,其优点是在链接的文件中详述。我快速浏览了一下,但看不到它的明确说明。

优点是每个语句都并行执行,所以我可能会得到速度提升?或者它是否满足某种逻辑,使用通常的 monadic 不方便let!

我明白,这是适用的,这意味着它带有我不能使用以前的表达式来确定后续表达式的逻辑的限制。那么这是否意味着权衡是效率的灵活性?

tor*_*nde 6

我理解Don Syme 的描述的方式,当我前段时间读到它时,let! ... and! ...链中的每一步都将被执行,不像你使用let! ... let! .... 例如,假设您使用optionCE。那么如果你写

option {
    let! a = parseInt("a")
    let! b = parseInt("b")
    return a + b
}
Run Code Online (Sandbox Code Playgroud)

只有第一个let!会被执行,因为 CE 一旦遇到 None 就会短路。改写let! a ... and! b = ...将尝试解析两个字符串;虽然不一定是并行的,正如我所理解的。

在解析来自外部来源的数据时,我看到了这方面的巨大好处。考虑例如运行

parse {
    let! name = tryParse<Name>("John Doe")
    and! email = tryParse<EMail>("johndoe@")
    and! age = tryParse<uint>("abc")
    return (name, email, age)
}
Run Code Online (Sandbox Code Playgroud)

并获得Error(["'johndoe@' isn't a valid e-mail"; "'abc' isn't a valid uint"])回报,而不仅仅是第一个错误。这对我来说很整洁。

  • 此外,每项计算都是相互独立的。一个人不能依赖另一个人的输出。这是一个限制,但也可能是有益的,因为任何处理它们的引擎都可以轻松地并行化它们。 (3认同)