首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有人能给我举几个F#中的多范式(对象函数)编程的例子吗?

有人能给我举几个F#中的多范式(对象函数)编程的例子吗?
EN

Stack Overflow用户
提问于 2010-11-07 02:18:29
回答 5查看 634关注 0票数 10

有人能给我举几个F#中的多范式(对象函数)编程的例子吗?

我特别寻找结合了OO和函数式编程的例子。已经有很多关于F#是一种混合语言的讨论,但我还没有找到示例来演示多范式编程的示例。

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-07 06:57:31

有两种方法可以组合函数式和面向对象的范例。在某种程度上,它们是独立的,您可以编写使用类型(编写为F#对象)结构化的不可变(函数式)代码。这样编写的Client类型的F#示例如下:

代码语言:javascript
运行
复制
// 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

请注意,WithIncome方法(“更改”客户端的收入)实际上不做任何修改-它遵循函数样式,创建一个新的、已更新的客户端,并将其作为结果返回。

另一方面,在F#中,您也可以编写面向对象的代码,这些代码具有可变的公共属性,但在幕后使用一些不可变的数据结构。当您有一些很好的函数代码并希望以传统的(命令式/面向对象)方式将其公开给C#程序员时,这可能会很有用:

代码语言:javascript
运行
复制
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

(该示例取自我的书中的Chapter 9源代码。还有一些不可变的面向对象代码的例子,例如在第14章的并行模拟中)。

票数 6
EN

Stack Overflow用户

发布于 2010-11-07 07:45:04

我用F#制作了一个小的(600行)俄罗斯方块克隆,它是使用XNA面向对象的。代码很旧(使用#light),并不是你见过的最漂亮的代码,但它是OOP和函数式的大胆混合。它由十个类组成。我不认为我传递了任何一流的函数,但它是F#在programming the small中的函数功能的一个很好的例子。

  • MyGame -继承XNA主游戏类,是程序入口point.
  • Board -跟踪不再移动的棋子和水平线completes.
  • UI - UI只有两个状态(播放和主菜单),由bool stateMenu
  • Tetris处理-处理游戏状态。游戏结束和棋子collision.
  • Piece -定义不同的俄罗斯方块形状及其移动,drawing.
  • Player - Handles用户input.
  • Shape -映射到primative.
  • Primative的基本图形对象-包装顶点基元类型。

我做了一个粗略的类图来帮助你。如果你对此有任何疑问,请随时在评论区提问。

票数 9
EN

Stack Overflow用户

发布于 2010-11-12 01:42:07

我将OO (特别是突变)和函数式编程混合在一起的最强大的经验是,通过在内部使用可变数据结构来实现性能提升,同时享受外部用户的不变性带来的所有好处。一个很好的例子是我写的一个算法的实现,它产生了字典序排列,你可以找到here。我使用的算法在其核心(数组的重复变异步骤)是必不可少的,如果使用函数式数据结构实现,它将受到影响。通过获取输入数组,最初制作它的只读副本以使输入不被破坏,然后在执行算法的变异步骤后在序列表达式中生成它的只读副本,我们在面向对象和函数式技术之间取得了很好的平衡。链接的答案引用了原始的C++实现,以及基准测试其他纯功能实现的答案。我的混合OO / functional实现的性能介于OO C++解决方案和纯functional F#解决方案的卓越性能之间。

这种在内部使用OO /可变状态,而在外部保持对调用者的纯状态的策略在整个F#库中都得到了使用,特别是在Seq模块中直接使用IEnumerators。

另一个例子可以通过比较使用可变字典实现的memoization和使用Don Syme探索here的不可变映射实现来找到。不可变字典实现比Map实现更快,但在用法上并不比Map实现差。

总而言之,我认为在F#中使用可变的OO对于寻求性能提升的库设计人员来说是最强大的,同时保持库消费者的一切都是纯功能的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4114437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档