Fuzion Logo
fuzion-lang.dev — The Fuzion Language Portal
JavaScript seems to be disabled. Functionality is limited.

composition

composition

composition -- a collection of features for function composition

see https://mlochbaum.github.io/BQN/tutorial/combinator.html

Talk at Strange Loop 2016 by Amar Shah: Point-Free or Die: Tacit Programming in Haskell and Beyond
https://www.youtube.com/watch?v=seVSlKazsNk

Talk at CppNorth 2023 by Conor Hoekstra: Function Composition in Programming Languages - Conor Hoekstra - CppNorth 2023
https://www.youtube.com/watch?v=JELcdZLre3s

Paper by Conor Hoekstra: Combinatory Logic and Combinators in Array Languages
https://web.archive.org/web/20220617020347id_/https://dl.acm.org/doi/pdf/10.1145/3520306.3534504

BQN tutorial: https://mlochbaum.github.io/BQN/tutorial/index.html

Talk for Fullstack Academy by Gabriel Lebec: Lambda Calculus - Fundamentals of Lambda Calculus & Functional
Pragramming in JavaScript
https://www.youtube.com/watch?v=3VQ382QG-y4

David C Keenan
To Dissect a Mockingbird: A Graphical Notation for the Lambda Calculus with Animated Reduction
https://dkeenan.com/Lambda/

Haskell package data.aviary.birds:
https://hackage.haskell.org/package/data-aviary-0.4.0/docs/Data-Aviary-Birds.html

Bird names from Raymond M Smullyan. 2000. To Mock a Mockingbird: and other
logic puzzles including an amazing adventure in combinatory logic. Oxford
University Press, USA.

Combinator birds: https://www.angelfire.com/tx4/cus/combinator/birds.html

Functions

§
(V 
type
, T 
type
, U 
type
, f Binary V T U, g Unary U T)
 => 
Unary V T
S
hook, monadic after
Bird: Starling
BQN: ⟜
Haskell: <*>
§
(W 
type
, V 
type
, U 
type
, T 
type
, f Binary W V U, g Unary U T)
 => 
Binary W V T
D
composition of one binary function f and one unary function g...
Bird: Dove
BQN: ⟜
Haskell:
§
 => 
String  
[Inherited from  Any]
create a String from this instance. Unless redefined, `a.as_string` will
create `"instance[T]"` where `T` is the dynamic type of `a`
§
(W 
type
, V 
type
, T 
type
, U 
type
, f Unary W V, g Binary V T U)
 => 
Binary W T U
B1
Elementary Compositor, 1° <- 2° composition
Bird: Blackbird
BQN: ∘
Haskell: .: or ...
§
(D 
type
, C 
type
, B 
type
, A 
type
, f Unary D C, g Unary C B, h Unary B A)
 => 
Unary D A
B3
triple compositor
Bird: Becard
BQN:
Haskell:
§
(U 
type
, V 
type
, W 
type
, f Unary U V, g Binary W U V)
 => 
Unary W V
B
composition of one unary function f and one binary function g...
Bird: Bluebird
BQN: ⊸
§
(U 
type
, T 
type
, W 
type
, V 
type
, f Unary U T, g Binary W U V)
 => 
Binary W T V
§
(V 
type
, U 
type
, T 
type
, f Unary V U, g Unary U T)
 => 
Unary V T
B
Elementary Compositor, composition
Bird: Bluebird
BQN: ∘
Haskell: .
§
(T 
type
, U 
type
, v T)
 => 
Unary T U
?
Constant cancellator?
Bird: ?
BQN: ˙
§
(T 
type
, U 
type
, V 
type
, v T)
 => 
Binary T U V
§
(T 
type
, U 
type
)
 => 
Binary T T U
§
(V 
type
, T 
type
, X 
type
, W 
type
, U 
type
, f Unary V T, g Binary X V W, h Unary W U)
 => 
Binary X T U
D2
composition of one binary function g and tow unary functions f, h
Bird: Dovekie
BQN: a⊸b⟜c
Uiua: ⊓ aka bracket
Haskell:
§
 => 
Type  
[Inherited from  Any]
Get the dynamic type of this instance. For value instances `x`, this is
equal to `type_of x`, but for `x` with a `ref` type `x.dynamic_type` gives
the actual runtime type, while `type_of x` results in the static
compile-time type.

There is no dynamic type of a type instance since this would result in an
endless hierarchy of types. So for Type values, dynamic_type is redefined
to just return Type.type.
§
(V 
type
, T 
type
, U 
type
, f Binary V T U)
 => 
Binary V U T
C
Elementary Permutator, reverse arguments
Bird: Cardinal
BQN: ˜
Haskell: flip
§
(V 
type
, U1 
type
, U2 
type
, T1 
type
, T2 
type
, f Binary V U1 U2, g Unary U1 T1, h Unary U2 T2)
 => 
Binary V T1 T2
Φ (S′)
composition of two unary functions and one binary function
Bird: ?
BQN: 3-train?
Haskell: liftA2
§
(V 
type
, U1 
type
, U2 
type
, T1 
type
, T2 
type
, f Binary V U1 U2, g Binary U1 T1 T2, h Binary U2 T1 T2)
 => 
Binary V T1 T2
Φ1
composition of two unary functions and one binary function
Bird: Pheasant (Hoekstra)
BQN: 3-train?
Haskell: ?
§
(T 
type
)
 => 
Unary T T
I
identity
Bird: Idiot (Smullyan) or Ibis (Gabriel Lebec)
BQN: ⊣⊢
Haskell: id
§
(U 
type
, T 
type
, f Binary U T T)
 => 
Unary U T
W
Elementary Duplicator
Bird: Warbler
BQN: ~
Haskell: join
§
(T 
type
, U 
type
)
 => 
Binary T T U
K
Elementary Cancellator, first
Bird: Kestrel
BQN: ⊣
Haskell const
§
(T 
type
, U 
type
, V 
type
, f0 Unary (Unary V T) (Unary U T), f1 Unary U T)
 => 
Unary V T
M
self application
Bird: Mockingbird
BQN: ?
Haskell: (cannot define)

This is not representable in Fuzion, we would need arguments with generic arguments
here. Using pseudo-syntax ((T,U type) <type using T,U>) to denote a type that is
itself type parameteric...:

public M(f ((T,U type) T -> U)) ((V,W type) V->W) => f f

we can emulate this if we require the argument to be given twice:
§
(T 
type
)
 => 
Unary T T
applying M to id:
§
(V 
type
, U 
type
, T 
type
, f Binary V U U, g Unary U T)
 => 
Binary V T T
Ψ - psi
composition of binary and unary function
Bird: ?
BQN: ○
Uiua: ∩ aka both
Haskell: on
§
(A 
type
, B 
type
, f Unary A (Unary B A), g Unary B A)
 => 
B
O

Bird: Owl
BQN: ?
Haskell: ?
§
 => 
String  
[Inherited from  Any]
convenience prefix operator to create a string from a value.

This permits usage of `$` as a prefix operator in a similar way both
inside and outside of constant strings: $x and "$x" will produce the
same string.
§
(T 
type
, U 
type
)
 => 
Binary U T U
KI
second
left ∘ flip
Bird: Kite
BQN: ⊢
Haskell: const id
§
(T 
type
, U 
type
, V 
type
, x T, f Binary V T U)
 => 
Unary V U
T
hold an argument
Bird: thrush
BQN: ?
Haskell: flip id
§
(T 
type
, U 
type
, V 
type
, W 
type
, x T, y U, f Function W T U V)
 => 
Unary W V
V
hold a pair of arguments
Bird: vireo
BQN: ?
Haskell: flip . flip id

Type Functions

§
 => 
String  
[Inherited from  Type]
string representation of this type to be used for debugging.

result has the form "Type of '<name>'", but this might change in the future

redefines:

§
 => 
Type  
[Inherited from  Type]
There is no dynamic type of a type instance since this would result in an
endless hierarchy of types, so dynamic_type is redefined to just return
Type.type here.

redefines:

§
(T 
type
)
 => 
bool  
[Inherited from  Type]
Is this type assignable to a type parameter with constraint `T`?

The result of this is a compile-time constant that can be used to specialize
code for a particular type.

is_of_integer_type(n T : numeric) => T : integer
say (is_of_integer_type 1234) # true
say (is_of_integer_type 3.14) # false

it is most useful in conjunction preconditions or `if` statements as in

pair(a,b T) is

=>

or

val(n T) is

§
 => 
String  
[Inherited from  Type]
name of this type, including type parameters, e.g. 'option (list i32)'.
§
 => 
String  
[Inherited from  Type]
convenience prefix operator to create a string from a value.

This permits usage of `$` as a prefix operator in a similar way both
inside and outside of constant strings: $x and "$x" will produce the
same string.

NYI: Redefinition allows the type feature to be distinguished from its normal counterpart, see #3913

redefines:

§
 => 
Type  
[Inherited from  Any]
Get a type as a value.

This is a feature with the effect equivalent to Fuzion's `expr.type` call tail.
It is recommended to use `expr.type` and not `expr.type_value`.

`type_value` is here to show how this can be implemented and to illustrate the
difference to `dynamic_type`.