Type: | Package |
Title: | Continuation Passing Style Development |
Version: | 0.1 |
Date: | 2015-11-30 |
Author: | Matteo Provenzano |
Maintainer: | Matteo Provenzano <matteo.provenzano@alephdue.com> |
Description: | Provides basic functions for Continuation-Passing Style development. |
License: | BSD_3_clause + file LICENSE |
URL: | http://www.alephdue.com |
LazyData: | TRUE |
Suggests: | testthat |
NeedsCompilation: | no |
Packaged: | 2015-12-02 13:54:21 UTC; matteo |
Repository: | CRAN |
Date/Publication: | 2015-12-02 15:10:26 |
Continuation Passing Style Function Composition
Description
It allows to compose two functions of the form f(x, ret)
and g(x, ret)
returning a function h(x,ret)
which is the composition f \circ g
.
It implements the composition operator of the Continuation category.
The the composition has the following properties:
Associativity:
h \circ (f \circ g) = ( h \circ g) \circ f
Unity:
f \circ identity2 = f = identity2 \circ f
In order for these relations to hold, the function f
and g
must not deal with global mutable states.
Usage
compose(f, g)
Arguments
f |
The first function that must be composed |
g |
The first function that must be composed |
Value
Rerturns the composite function of f
and g
Note
The composition is performed from left to right i.e. such that the first function executed is f
.
Author(s)
Matteo Provenzano
http://www.alephdue.com
See Also
Examples
# Example 1
# define an arrow in the Continuation category.
# this function applies the continuation to the
# increment of its argument and then decrements it.
one <- function(x, ret) {
return(ret(x+1) - 1)
}
# define another arrow in the Continuation category.
# this function doubles its argument.
two <- function(x, ret) {
return(ret(2*x))
}
# create the composition
# this is exactly the same as one %.% two
composite <- compose(one, two)
# build the function (forget the continuation)
execute1 <- forget(composite)
execute1(1)
# returns 3
# Example 2
# compose the function further to loop over an array of elements
# lapply and sapply are already arrow in the Continuation category
loop <- compose(lapply, composite)
# build the function
execute2 <- forget(loop)
execute2(1:10)
Compose and Forget in one go.
Description
do
allows to specify the list of function directly as its arguments.
It return a function which is the composition of every argument with the continuation already forgotten.
Usage
do(...)
Arguments
... |
The functions that must be composed together. |
Value
A function of the type g(x)
which can be directly used on the input.
Author(s)
Matteo Provenzano
http://www.alephdue.com
See Also
Examples
# define a function that doubles its argument
times.two <- function(x, ret) {
ret(x*2)
}
# define a function that loops over a list of list and double every element
loop <- do(lapply, lapply, times.two)
#returns list(list(2, 4, 6), list(8,10,12))
loop(list(list(1,2,3),list(4,5,6)))
Forgets the Continuation
Description
This function takes a function of the form f(x, ret)
and forgets the ret
part returning a function of the form g(x)
.
Usage
forget(f)
Arguments
f |
a function of the form |
Value
a function of the form f(x)
.
Author(s)
Matteo Provenzano
http://www.alephdue.com
See Also
Examples
# forget the FUN part in lapply
to.list <- forget(lapply)
# returns the list of the natural numbers from 1 to 10
to.list(1:10)
The Identity Arrow
Description
The identity arrow for the Continuation category for which holds: f %.% identity2 = f = identity2 %.% f
Usage
identity2(x, ret)
Arguments
x |
The value on which the function operates |
ret |
The following computation |
Value
This function always returns the original arrow.
Author(s)
Matteo Provenzano
http://www.alephdue.com
Creates the monoid binary operator
Description
Creates the monoid binary operator for a monoid in the Continuation category.
Usage
monoid(op)
Arguments
op |
The binary operator to be be insert in the monoid (multiplication). |
Value
It returns a function of the type h(f, g)
where f
and g
must be elements of the monoid and objects in the Continuation category. The function h
will return a function of the type t(x, ret)
which can be used in the Continuation category.
Note
The developer must make sure that the function f
and g
are elements of a monoid and of the Continuation category. The developer must also ensure that the operator op
is the monoid's binary operator.
Author(s)
Matteo Provenzano
http://www.alephdue.com
References
https://en.wikipedia.org/wiki/Monoid_(category_theory)
See Also
Examples
# A list is a monoid
replicate.10 <- function(x, ret) {
ret(rep(x, 10))
}
# concatenation is the binary operator for the list monoid
# the empty list is the unit
`%et%` <- monoid(c)
replicate.20 <- do(replicate.10 %et% replicate.10)
# returns a list of 20 "a"s
replicate.20("a")
Compose all the function in a list
Description
It applies the compose
opertor recursively on all the elements of the list provided as argument
Usage
path(fs)
Arguments
fs |
The list of the functions that must be composed together (e.g: list(f1, f2, f3, ...)). |
Value
A function of the type g(x, ret)
result of the pairwise composition of each element in the list.
Author(s)
Matteo Provenzano
http://www.alephdue.com
Examples
# define a function that doubles its argument
times.two <- function(x, ret) {
ret(x*2)
}
# define a function that loops over a list of list and double every element
loop <- forget(path(list(lapply, lapply, times.two)))
#returns list(list(2, 4, 6), list(8,10,12))
loop(list(list(1,2,3),list(4,5,6)))