15.1.3 可组合值
来源:互联网 发布:数控锥度螺纹编程实例 编辑:程序博客网 时间:2024/06/01 09:20
15.1.3 可组合值
把问题描述为值,是把"语言"嵌入 F# 中的最简单的方法。这仅适用于简单的问题:我们不要指定任何复杂行为(比如,过滤函数的断言) ,和只需要通过组合基元对象或集合,并指定它们的属性,就能描述的大多数的问题。
当代码有效地描述值时,我们可以在 F# 中实现它,通过创建类型,能够创建指定所有属性的值。表示这类问题的最常见的 F# 类型,是差别联合,对于有大量属性的基元,也可以使用列表(表示项的集合),或记录。清单 15.1 显示一个简单的类型声明,与前面 LISP 中示例同样的动画。
Listing 15.1 Specifying animations using discriminated unions (F#)
type AnimatedLocation =
| Static of PointF
| Rotating of PointF * float32
| Linear of PointF * PointF
type Animation =
| Disc of Brush * int * AnimatedLocation
| Compose of Animation * Animation
使用这个类型,我们现在可以创建描述简单动画的值。从某种意义上讲,清单 15.1 中的类型指定的语法,也用于创建动画的库,因为它指定了什么是有效的动画值。下面的代码片断显示在 LISP 中相同的动画效果:
let animation =
Compose(
Disc(Brushes.Green, 50, Rotating(PointF(0.f,0.f), 100.f)),
Disc(Brushes.Red, 20, Linear(PointF(-100.f,0.f), PointF(100.f,0.f)))
)
这段代码创建一个树状结构的值,描述由两个盘子组成的动画。它指定每个对象如何随时间而改变位置,F# 的数据结构 AnimatedLocation 创建的对象是静态的,可以旋转,或沿着一条直线移动。
当在 C# 中使用这种方法时,可以把这个差别联合类型重写为类层次。然后,通过创建一个对象树,获得类似的结果。在 C# 3.0 中,这由对象和集合初始值设定项功能,做了进一步简化:
var animation = new Compose(
new Disc { Brush = Brushes.Green, Diameter = 50, Movement =
new Rotating(new PointF(0.0f,0.0f), 100.0f) },
new Disc { Brush = Brushes.Red, Diameter = 20, Movement =
new Linear(new PointF(-100.0f, 0.0f), new PointF(100.0f, 0.0f) } }
);
原理是相同的:声明性的库用于创建描述问题的值。在差别联合或集合和对象之间的选择,在很大程度上受语法影响,使得可以在宿主语言中创建最自然的代码。
构建数据结构,这基本上是描述动画的消极方式。我们要看一种技术,使代码有更积极的感觉。
- 15.1.3 可组合值
- 15.1 可组合设计方法
- 15.1.4 可组合函数和对象
- 可重复组合
- 15 第十五章 创建可组合函数库
- 全组合(可包含重复字符)
- 全组合(可包含重复字符)
- 可重复组合公式的证明
- 可重复组合的应用 By ACReaper
- 可重复选择的组合-vijos1060 盒子
- 面试题精选(64):元素可重复组合算法
- 可写可选的下拉列表和文本框组合
- 会议室可分隔组合时的音频处理解决方案
- 求教:可组合的网络协议设计与实现
- 输出所有的字符组合(可重复)
- UVa 10910 Marks Distribution (可重复组合数)
- JQuery Easy Ui 可装载组合框 - ComboBox
- EDI采用标准组件设计可根据要求组合
- 探索式测试学习笔记之二:全局探索式测试法
- 获得第k小元素
- 硬件项目设计心得
- W3C Web IDL
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 / / 节中包括 .
- 15.1.3 可组合值
- 使用python制作简单的日志以及日志分析工具
- C语言产生一个[M, N]区间上的随机数
- 【理想流】不要做虚情假意的管理
- 把李咏笑趴下的经典瞬间
- 对骨骼动画的一点理解
- TangentSpaceVectors的创建
- QT编程技巧.QString和QDateTime之间的相互转换
- 设计模式2-Builder模式