有没有理由F#中的工作流构建器不使用接口?

Rei*_*aka 2 monads f#

这只是出于好奇的问题:当您实现工作流工厂时,不要将其作为接口实现,而只是确保monad函数的函数签名匹配.这有设计理由吗?

kvb*_*kvb 7

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


Tom*_*cek 5

我认为kvb提到的缺乏高级类型可能是主要原因.有办法解决这个问题,但这会让代码变得模糊不清(请参阅此代码段).

另一个原因是F#计算表达式允许您定义不同的方法组合.它并不总是BindReturn.例如:

  • 一些定义Yield,YieldFrom,Combine,以允许生成结果
  • 一些定义Return,ReturnFrom,Bind定义一个单子
  • 一些限定Return,ReturnFrom,Bind,Combine定义一个单子可以返回多个事
  • 也有人定义DelayDelayRun处理懒惰

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