Sha*_*bie 10 oop f# functional-programming
有人能指出我在F#中进行多范式(对象功能)编程的例子吗?
我特意寻找结合OO和函数式编程的例子.关于F#是一种混合语言有很多话题,但是我找不到能够演示多范式编程示例的例子.
谢谢
我用F#做了一个小的(600行)Tetris克隆,使用XNA进行面向对象.代码是旧的(使用#light),并不是你将看到的最漂亮的代码,但它绝对是OOP和功能的混合.它由十个班组成.我认为我没有通过任何一流的功能,但它是F#编程小功能的一个很好的例子.
bool stateMenu我做了一个粗略的类图来帮助.如果您有任何疑问,请随时在评论部分询问.

有两种方法可以将功能和面向对象的范例结合起来.在某种程度上,它们是独立的,您可以编写使用类型(写为F#对象)构造的不可变(功能)代码.Client像这样写的类型的F#示例是:
// Functional 'Client' class
type Client(name, income) =
// Memebers are immutable
member x.Name = name
member x.Income = income
// Returns a new instance
member x.WithIncome(ninc) =
new Client(name, ninc)
member x.Report() =
printfn "%s %d" name income
Run Code Online (Sandbox Code Playgroud)
请注意,该WithIncome方法("更改"客户的收入)实际上并没有进行任何修改 - 它遵循功能样式并创建一个新的,更新的客户端并将其作为结果返回.
另一方面,在F#中,您还可以编写具有可变公共属性的面向对象代码,但在封面下使用一些不可变数据结构.当你有一些很好的功能代码并希望以传统的(命令式/面向对象的)方式将它暴露给C#程序员时,这可能很有用:
type ClientList() =
// The list itself is immutable, but the private
// field of the ClientList type can change
let mutable clients = []
// Imperative object-oriented method
member x.Add(name, income) =
clients <- (new Client(name, income))::clients
// Purely functional - filtering of clients
member x.Filter f =
clients |> List.filter f
Run Code Online (Sandbox Code Playgroud)
(该示例取自本书第9章的源代码.还有一些不可变的面向对象代码的例子,例如第14章中的并行仿真).