【发布时间】:2011-12-16 17:29:28
【问题描述】:
我正在尝试掌握连续传球风格 (CPS),因此我正在修改 Gary Short 很久以前向我展示的示例。我没有他的示例源代码,所以我试图从内存中修改他的示例。考虑以下代码:
let checkedDiv m n =
match n with
| 0.0 -> None
| _ -> Some(m/n)
let reciprocal r = checkedDiv 1.0 r
let resistance c1 c2 c3 =
(fun c1 -> if (reciprocal c1).IsSome then
(fun c2 -> if (reciprocal c2).IsSome then
(fun c3 -> if (reciprocal c3).IsSome then
Some((reciprocal c1).Value + (reciprocal c2).Value + (reciprocal c3).Value))));;
我不太明白如何构造阻力函数。我之前想出了这个:
let resistance r1 r2 r3 =
if (reciprocal r1).IsSome then
if (reciprocal r2).IsSome then
if (reciprocal r3).IsSome then
Some((reciprocal r1).Value + (reciprocal r2).Value + (reciprocal r3).Value)
else
None
else
None
else
None
但是,当然,这并没有使用 CPS——更不用说它看起来很 hacky 并且有相当多的重复代码,这也似乎是代码的味道。
有人可以告诉我如何以 CPS 方式重写阻力函数吗?
【问题讨论】:
-
你会使用计算表达式吗?还是不符合 CPS 标准?
-
@Shlomo——这不是一个坏建议,但它有点本末倒置。我正在努力掌握 CPS,因为 CPS 是计算表达式结构的一部分。