有人能指出我在F#中进行多范式(对象功能)编程的例子吗?

Sha*_*bie 10 oop f# functional-programming

有人能指出我在F#中进行多范式(对象功能)编程的例子吗?

我特意寻找结合OO和函数式编程的例子.关于F#是一种混合语言有很多话题,但是我找不到能够演示多范式编程示例的例子.

谢谢

gra*_*bot 9

我用F#做了一个小的(600行)Tetris克隆,使用XNA进行面向对象.代码是旧的(使用#light),并不是你将看到的最漂亮的代码,但它绝对是OOP和功能的混合.它由十个班组成.我认为我没有通过任何一流的功能,但它是F#编程小功能的一个很好的例子.

  • MyGame - 继承XNA主游戏类,是程序入口点.
  • Board - 跟踪不再移动的碎片并完成水平线.
  • UI - UI仅处理两种状态(播放和主菜单)bool stateMenu
  • 俄罗斯方块 - 处理游戏状态.游戏结束和片断碰撞.
  • Piece - 定义不同的俄罗斯方块形状及其运动和绘图.
  • 播放器 - 处理用户输入.
  • Shape - 映射到primative的基本图形对象.
  • Primative - 包装Vertex原始类型.

我做了一个粗略的类图来帮助.如果您有任何疑问,请随时在评论部分询问.

替代文字


Tom*_*cek 6

有两种方法可以将功能和面向对象的范例结合起来.在某种程度上,它们是独立的,您可以编写使用类型(写为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章中的并行仿真).

  • 我读过你的书和几本F#书.大多数示例都是功能性的或者oo但是没有显示混合OO和函数编程的任何真正优势. (2认同)