Я пытаюсь овладеть стилем продолжения прохождения (CPS) и поэтому перерабатываю пример, показанный мне Гэри Шортом довольно давно.У меня нет его исходного кода, поэтому я пытаюсь переделать его пример из памяти.Рассмотрим следующий код:
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 - не говоря уже о том, что это кажется действительно взломанным и есть довольно много повторяющегося кода, который также выглядитКодовый запах.
Может кто-нибудь показать мне, как переписать функцию сопротивления способом CPS?