15.2.4 在 F# 中创建简单的行为

15.2.4 在 F# 中创建简单的行为

 

    我们将从复制刚才在 C# 中已经实现的功能开始。清单 15.6 实现两个行为值(wiggle 和 time),和一个用于创建常量行为的函数(forever)。

 

Listing 15.6 Primitive behavior functions and values (F#)

 

> open System;;
> let sample(a) = BehaviorFunc(a);;
val sample : (BehaviorContext -&gt; 'a) -&gt; Behavior<'a>

&gt; let forever(n) = sample(fun _ -&gt; n)
   let time = sample(fun t -&gt; t.Time)
   let wiggle = sample(fun t -&gt; sin(t.Time * float32 Math.PI))
;;
val forever : 'a -&gt; Behavior<'a>
val time : Behavior<float32>
val wiggle : Behavior<float32>

 

    清单 15.6 首先创建一个工具函数,叫 sample,这类似于前面的 Behavior.Create 方法。我们可以直接使用差别联合构造函数 BehaviorFunc ,但是,要确保内部表示不必要地暴露。万一我们以后要更改表示法,比如说,从函数到值的列表,我们可能仍要合理地实现 sample 函数。名字 sample 反映出,该函数可以用于获取在选定时间单独的观察(统计中称为抽样)。

    一旦我们有了这个工具函数,就可以创建三个基元,正如在清单 15.5 中所做的。你还可以看到,由 F# Interactive 推断的类型签名。有一个泛型函数(forever)和两个简单的值(time 和 wiggle)。还没有实现的 C# 代码的一个方面,是语法上友好构建常量数值行为。使用 forever 函数,可以写成 (forever  0.5f),并不是优雅。我们可以在 C# 中使用相同的方法,为类型 float32 定义类型扩展:

 

type System.Single with
  member x.forever = forever(x)

 

    为了实现扩展成员,必须使用 float32 完整的 .NET 名称 ,即 System.Single。F# 中的扩展成员并不限于方法,所以,把此扩展实现为属性。它像这样使用:

 

&gt; let v = 123.0f.forever;;
val v : Behavior<System.Single>

 

    正如你所看到的,语法非常优雅。如果我们严格遵循 .NET 的命名,属性的名称应该大写 F 开头。然而,我们正在写的库,尝试看起来像一种语言。在这种情况下,语法是重要的,小写的单词标识符通常被用作 DSL 的关键字。现在,我们知道如何创建基元行为了,将探讨如何使用。像这样的探索性编程的最佳工具是 F# Interactive。

你可能感兴趣的:(职场,values,休闲,forever)