Files
2023-11-01 09:29:33 +01:00

15 KiB
Raw Permalink Blame History

layout, title, parent, ancestor
layout title parent ancestor
default Functions Abstraction Funcons-beta

Funcons-beta : Functions.cbs

Functions

[
  Datatype functions
  Funcon   function
  Funcon   apply
  Funcon   supply
  Funcon   compose
  Funcon   uncurry
  Funcon   curry
  Funcon   partial-apply
]
Meta-variables
  T, T, T1, T2 <: values
Datatype
  functions(T,T) ::= function(A:abstractions(T=>T))

functions(T, T) consists of abstractions whose bodies may depend on a given value of type T, and whose executions normally compute values of type T. function(abstraction(X)) evaluates to a function with dynamic bindings, function(closure(X)) computes a function with static bindings.

Funcon
  apply(_:functions(T, T), _:T) : =>T

apply(F, V) applies the function F to the argument value V. This corresponds to call by value; using thunks as argument values corresponds to call by name. Moreover, using tuples as argument values corresponds to application to multiple arguments.

Rule
  apply(function(abstraction(X)), V:T) ~> give(V, X)
Funcon
  supply(_:functions(T, T), _:T) : =>thunks(T)

supply(F, V) determines the argument value of a function application, but returns a thunk that defers executing the body of the function.

Funcon
  compose(_:functions(T2, T), _:functions(T1, T2)) : =>functions(T1, T)

compose(F2, F1) returns the function that applies F1 to its argument, then applies F2 to the result of F1.

Funcon
  uncurry(F:functions(T1, functions(T2, T))) : 
    =>functions(tuples(T1, T2), T)
   ~> function(abstraction(
         apply(
           apply(F, checked index(1, tuple-elements given)),
           checked index(2, tuple-elements given))))

uncurry(F) takes a curried function F and returns a function that takes a pair of arguments..

Funcon
  curry(F:functions(tuples(T1, T2), T)) : =>functions(T1, functions(T2, T))
    ~> function(abstraction(partial-apply(F, given)))

curry(F) takes a function F that takes a pair of arguments, and returns the corresponding 'curried' function.

Funcon
  partial-apply(F:functions(tuples(T1, T2), T), V:T1) : =>functions(T2, T)
    ~> function(abstraction(apply(F,tuple(V,given))))

partial-apply(F, V) takes a function F that takes a pair of arguments, and determines the first argument, returning a function of the second argument.


From the PLanCompS Project | CBS-beta issues... | Suggest an improvement...