这是一个出于好奇的问题:当您实现工作流工厂时,不要将其作为接口实现,而只是确保monad函数的函数签名匹配。这有设计理由吗?
答案 0 :(得分:7)
首先,.NET中缺少高级类型意味着您无法为方法提供有用的签名。例如,ListBuilder.Return
应该有't -> 't list
类型,而OptionBuilder.Return
应该有类型't -> 't option
。无法使用Return
方法创建具有支持这两种方法的签名的接口。
答案 1 :(得分:5)
我认为kvb提到的缺乏高级类型可能是主要原因。有一些方法可以解决这个问题,但这会让代码变得模糊不清(参见this snippet)。
另一个原因是F#计算表达式允许您定义不同的方法组合。它并不只是Bind
和Return
。例如:
Yield
,YieldFrom
,Combine
以允许生成结果Return
,ReturnFrom
,Bind
来定义monad Return
,ReturnFrom
,Bind
,Combine
来定义可以返回多项内容的monad Delay
或Delay
和Run
来处理懒惰...所以计算表达式需要被定义为相当多的不同接口。我认为当前的设计在您可以支持的计算功能方面留下了很好的灵活性。