Quark v2.3.0 Quark.FixedPoint View Source

Fixed point combinators generalize the idea of a recursive function. This can be used to great effect, simplifying many definitions.

For example, here is the factorial function written in terms of y/1:

iex> fac = fn fac ->
...>   fn
...>     0 -> 0
...>     1 -> 1
...>     n -> n * fac.(n - 1)
...>   end
...> end
...> factorial = y(fac)
...> factorial.(9)
362880

The resulting function will always be curried

iex> import Quark.SKI, only: [s: 3]
...> one_run = y(&s/3)
...> {_, arity} = :erlang.fun_info(one_run, :arity)
...> arity
1

Link to this section Summary

Functions

Alan Turing’s fix-point combinator. This is the call-by-value formulation

y()

The famous Y-combinator. The resulting function will always be curried

z()

A normal order fixed point

Link to this section Functions

Alan Turing’s fix-point combinator. This is the call-by-value formulation.

Examples

iex> fac = fn fac ->
...>   fn
...>     0 -> 0
...>     1 -> 1
...>     n -> n * fac.(n - 1)
...>   end
...> end
...> factorial = turing(fac)
...> factorial.(9)
362880
Link to this function turing(fun) View Source
turing((... -> any)) :: (... -> any)

The famous Y-combinator. The resulting function will always be curried.

Examples

iex> fac = fn fac -> …> fn …> 0 -> 0 …> 1 -> 1 …> n -> n * fac.(n - 1) …> end …> end …> factorial = y(fac) …> factorial.(9) 362880

Link to this function y(fun) View Source
y((... -> any)) :: (... -> any)

A normal order fixed point.

Examples

iex> fac = fn fac ->
...>   fn
...>     0 -> 0
...>     1 -> 1
...>     n -> n * fac.(n - 1)
...>   end
...> end
...> factorial = z(fac)
...> factorial.(9)
362880
Link to this function z(g, v) View Source
z((... -> any), any) :: (... -> any)