F#中的工作流构建器是否有使用接口的原因?

时间:2011-04-26 07:26:12

标签: f# monads

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

我认为kvb提到的缺乏高级类型可能是主要原因。有一些方法可以解决这个问题,但这会让代码变得模糊不清(参见this snippet)。

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

  • 有些人定义YieldYieldFromCombine以允许生成结果
  • 有些人定义ReturnReturnFromBind来定义monad
  • 有些人定义ReturnReturnFromBindCombine来定义可以返回多项内容的monad
  • 有些人还定义DelayDelayRun来处理懒惰

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