功能范式中的可插入性

时间:2013-06-17 18:52:59

标签: f# functional-programming

在项目中处理可插拔性的正确功能方法是什么?我正在研究F#中的一个新的开源项目,似乎无法从我的脑海中获得插件和接口的面向对象的想法。我希望能够换出的东西是记录器,数据存储和身份验证。

我一直在寻找相当多的答案,但除此之外没有提出太多: http://flyingfrogblog.blogspot.com/2010/12/extensibility-in-functional-programming.html

1 个答案:

答案 0 :(得分:7)

对于不同的功能语言,这个问题的答案会有所不同。 F#不是纯粹的功能 - 它从功能性,命令性和面向对象的世界中获得最佳效果。

对于日志记录和身份验证之类的东西,最务实的方法是使用接口(在F#中,使用接口是完全正常的,但人们通常不使用继承而是更喜欢组合)。

当您有多个可以调用的不同函数时,简单的界面是有意义的:

 type IAuthentication =
   abstract Authenticate : string * string -> bool
   abstract ResetPassword : string * string -> void

您可以使用object expressions,这是在F#中实现接口的一种非常好的方法。 如果您只有一个函数(比如记录消息),那么您可以通过函数(就像只有一个方法的接口)来参数化代码:

 type Logger = string -> unit

对于身份验证和日志记录(在应用程序运行时可能不会更改),您可以使用全局可变值。虽然如果要同步来自多个线程的请求并且存在一些可变状态,那么编写F# agent可能是个好主意。