Quark v2.2.0 Quark.SKI

The classic SKI system of combinators. s and k alone can be used to express any algorithm, though generally not efficiently.

Summary

Functions

i()

The identity combinator. Also aliased as id

k()

The constant (“Konstant”) combinator. Returns the first argument unchanged, and discards the second argument

s()

The “substitution” combinator. Applies the last argument to the first two, and then the first two to each other

Opposite of first (the k combinator)

Functions

constant(a, b)

See Quark.SKI.k/2.

first(a, b)

See Quark.SKI.k/2.

i()

The identity combinator. Also aliased as id.

iex> i(1)
1

iex> i("identity combinator")
"identity combinator"

iex> [1,2,3] |> id
[1,2,3]
i(x)

Specs

i(any) :: any
id(x)

See Quark.SKI.i/1.

k()

The constant (“Konstant”) combinator. Returns the first argument unchanged, and discards the second argument.

Can be used to repeatedly apply the same value in functions such as folds.

Aliased as first and constant.

Examples

iex> k(1, 2)
1

iex> k("happy", "sad")
"happy"

iex> Enum.reduce([1,2,3], [42], &k/2)
3

iex> Enum.reduce([1,2,3], [42], &constant/2)
3

iex> first(1,2)
1
k(x)
k(x, y)

Specs

k(any, any) :: any
s()

The “substitution” combinator. Applies the last argument to the first two, and then the first two to each other.

Examples

iex> add = &(&1 + &2)
...> double = &(&1 * 2)
...> s(add, double, 8)
24
s(x)
s(x, y)
s(x, y, z)

Specs

s((... -> any), (... -> any), any) :: any
second()

Opposite of first (the k combinator).

While not strictly part of SKI, it’s a common enough case.

Returns the second of two arguments. Can be used to repeatedly apply the same value in functions such as folds.

Examples

iex> second(43, 42)
42

iex> Enum.reduce([1,2,3], [], &second/2)
[]
second(a)
second(a, b)

Specs

second(any, any) :: any