Exercises in Programming Style–Kick Forward

NOTE : read the rest of the series, or check out the source code.

If you enjoy read­ing these exer­cises then please buy Crista’s book to sup­port her work.

exercises-prog-styles-cover

Fol­low­ing on from the last post, we will look at the Kick Forward style today.

 

Style 8 – Kick Forward

You may also know this style as Continuation-Passing Style, or CPS for short.

 

Constraints

  • All the constraints from the Pipeline style
  • Each function takes an additional parameter, usually the last, which is another function
  • That function parameter is applied at the end of the current function
  • That function parameter is given, as input, what would be the output of the current function
  • The larger problem is solved as a pipeline of functions, but where the next function to be applied is given as parameter to the current function

 

Now, the port for Crista’s solution was pretty straight forward:

image

in the end, we ended up with a bunch of functions that:

  • takes in a continuation (the dotted lined box below)
  • executes the continuation whilst supplying a continuation for the aforementioned continuation

with the exception of printText which expects a continuation that doesn’t expect a continuation.

image

Looking at these functions (or, building blocks), I don’t really see the execution flow just yet. Instead, I see roughly two execution paths starting with readFile and filterChars.

Let’s rearrange things a little bit:

image

Ahhh, now things finally made sense when I follow the zigzag line!

image

Although CPS is an important pattern to understand and familiarize yourself with, I have never written any non-trivial application code in this style as it’s not straight forward and obvious, and adds unnecessary complexity in many cases.

Case in point:

image

 

That said, if you have ever used computation expressions in F# (async { }, seq { }, query { }, cloud { }, etc.) then you have written code in CPS without realizing.

Consider the signature of bind:

image

Essentially, computation expressions just takes your sequential code and turns it into CPS code.

If you want to learn more about computation expressions, Scott Wlaschin has a great series of posts on the topic.

 

You can find all the source code for this exer­cise here.

1 Comment

  1. Pingback: F# Weekly #45, 2015 | Sergey Tihon's Blog

Leave a Reply

Your email address will not be published.