功能范式中的可插入性

Tyl*_*ith 3 f# functional-programming

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

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

Tom*_*cek 7

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

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

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

 type IAuthentication =
   abstract Authenticate : string * string -> bool
   abstract ResetPassword : string * string -> void
Run Code Online (Sandbox Code Playgroud)

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

 type Logger = string -> unit
Run Code Online (Sandbox Code Playgroud)

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