在F#中重载函数调用行为?

时间:2011-11-13 20:57:18

标签: f# overloading

可以吗?我一直在挖掘,并没有找到任何关于它是否可能的事情。

我想要重载函数调用行为的主要原因是我最终得到了一些使用一些非常复杂的闭包的代码,这些闭包捕获了大量的本地状态来处理。

我发现这种嵌套的闭包确实令人困惑,并希望将它们转换为具有良好定义的模式和继承等的完整对象,而不必将接口更改为其余代码。

1 个答案:

答案 0 :(得分:4)

F#不支持重载函数应用程序行为,因此您无法以与函数相同的方式编写可以调用的对象。我担心你必须改变界面使用类似的东西:

foo.Invoke(10, "Hello")

而不是:

foo 10 "Hello"

对象的使用通常也表明实体更复杂,因此通过更改界面,您可以向开发人员调用它提供一些提示(说这是一个复杂的类型)。根据您的域名,您还应该找到Invoke的更具描述性的名称。

我还改变了语法,使用了tupled方法参数而不是curried样式 - 从技术上讲,你也可以使用curried样式,但通常不使用它(它只对简单的函数更好)。

最后,如果您发现闭包代表更复杂的数据结构,也许您可​​以使数据结构更加明确,并定义type来保存数据。然后你可以使用普通函数,但是给它们作为一个额外的参数(虽然这只是一个对你来说可能没用的想法)。