F#don'中的工作流生成器有什么原因吗;你不使用接口吗?

F#don'中的工作流生成器有什么原因吗;你不使用接口吗?,f#,monads,F#,Monads,这是一个出于好奇的问题:当您实现工作流工厂时,您并不是作为接口实现来实现的,而是确保monad函数的函数签名匹配。这有设计原因吗?首先,在.NET中缺少更高级的类型意味着无法为方法提供有用的签名。例如,ListBuilder.Return应具有类型't->'t list,而OptionBuilder.Return应具有类型't->'t选项。无法使用签名支持这两种方法的Return方法创建接口。我认为缺少kvb提到的更高级类型可能是主要原因。有一些方法可以解决这个问题,但这会使代码有点晦涩难懂(请

这是一个出于好奇的问题:当您实现工作流工厂时,您并不是作为接口实现来实现的,而是确保monad函数的函数签名匹配。这有设计原因吗?

首先,在.NET中缺少更高级的类型意味着无法为方法提供有用的签名。例如,
ListBuilder.Return
应具有类型
't->'t list
,而
OptionBuilder.Return
应具有类型
't->'t选项
。无法使用签名支持这两种方法的
Return
方法创建接口。

我认为缺少kvb提到的更高级类型可能是主要原因。有一些方法可以解决这个问题,但这会使代码有点晦涩难懂(请参阅)

另一个原因是F#计算表达式允许您定义不同的方法组合。不仅仅是
Bind
Return
。例如:

  • 一些定义了
    产量
    产量
    组合
    ,以允许生成结果
  • 有些人定义
    Return
    ReturnFrom
    Bind
    来定义monad
  • 有些定义了
    返回
    返回自
    绑定
    组合
    ,以定义一个可以返回多个内容的monad
  • 有些人还定义了
    Delay
    Delay
    Run
    来处理懒惰

。。。因此,计算表达式需要定义为许多不同的接口。我认为当前的设计在您可以支持的计算功能方面留下了一些很好的灵活性。

我的最佳猜测是,如果您不想实现所有功能,您不必实现所有功能?是的,这在很大程度上超出了我的想象!是的,我想他们需要制作大量的接口,但这似乎并不是一个足够的理由让你用一种看似黑客的方式来定义monad。