13得票4回答
操作类型(单子?)的LINQ查询表达式除IEnumerable<T>外的其他用途是什么?

我正在阅读由Tomas Petricek和Jon Skeet所著的《实用函数式编程》一书,但是我很难理解有关计算表达式1)(又称单子)的部分。 通过这本书,我了解到——与我的以往经验相反——LINQ查询表达式不仅限于IEnumerable&lt;T&gt;,还可以在其他自定义类型上工作。 这...

13得票4回答
我该如何编写一个计算表达式生成器,可以累加值并允许使用标准语言结构?

我有一个计算表达式生成器,随着进行构建值,并具有许多自定义操作。但它不允许标准的F#语言结构,我很难弄清楚如何添加此支持。为了给出一个独立的例子,这里是一个非常简单且没有太多意义的计算表达式,它构建F#列表:type Items&lt;'a&gt; = Items of 'a list ty...

11得票5回答
如何更改Rx Builder实现以修复堆栈溢出异常?

我试图设计一个Rx生成器,以在F#计算表达式语法中使用响应式扩展。如何修复它,使其不会导致堆栈溢出?就像下面的Seq示例一样。 并且有没有提供RxBuilder的实现作为Reactive Extensions或将来.NET Framework版本的一部分的计划?open System open...

11得票2回答
如何在异常处理中重新抛出异常后保留堆栈跟踪信息?

TL;DR: 如何在保留原始异常堆栈跟踪的情况下,稍后引发先前捕获的异常。 由于我认为这在使用Result单子或计算表达式时很有用,特别是因为该模式经常用于包装异常而不抛出它,因此这里提供了一个详细的示例: type Result&lt;'TResult, 'TError&gt; = ...

10得票1回答
如何将这个单子绑定变成尾递归?

我有一个叫做Desync的单子-[&lt;AutoOpen&gt;] module DesyncModule = /// The Desync monad. Allows the user to define in a sequential style an operation th...

10得票2回答
如何在maybe计算构建器中实现延迟?

这是我目前的进展: type Maybe&lt;'a&gt; = option&lt;'a&gt; let succeed x = Some(x) let fail = None let bind rest p = match p with | None -&g...

10得票2回答
在连续单子中的StackOverflow

使用以下的continuation monad:type ContinuationMonad() = member this.Bind (m, f) = fun c -&gt; m (fun a -&gt; f a c) member this.Return x = fun k...

10得票1回答
if..then结构中使用零来表示else分支的背后逻辑在计算表达式中。

msdn文档中对于计算表达式中Zero方法的解释如下: 在计算表达式中,用于处理if...then语句中空的else分支。 假设我们正在使用一个未定义Zero的identity计算生成器。let IdentityBuilder() = member this.Bind(i...

9得票2回答
在自定义计算表达式中实现绑定

我正在尝试通过实现自己的计算表达式来更好地了解F#的计算表达式。然而,我在使用Bind方法时遇到了障碍。以下是我目前的代码: type public op&lt;'a&gt; = Op of ('a list -&gt; 'a list) let inline (&gt;&gt;) (Op...

8得票1回答
F# 提示计算表达式中未定义的值

我一直在使用F#计算表达式和状态Monad,并尝试使用自定义操作。我遇到了一些奇怪的行为,这让我很困惑。编译器报告一个值不存在,但该值在前两行中已经声明。 type State&lt;'a, 's&gt; = ('s -&gt; 'a * 's) module State = //...