Published
Edited
Jan 10, 2020
Insert cell
Insert cell
{
var adder = val1 => val2 => val1 + val2
var incr = adder(1)
var to_integer = qtyFn => qtyFn(incr)(0)

var ZERO = transform => start_value => start_value
var SUCC = qtyFn => transform => start_value => transform(qtyFn(transform)(start_value))

var ONE = SUCC(ZERO)
var TWO = SUCC(ONE)
var THREE = SUCC(TWO)

// To add TWO and THREE together, we simply apply the SUCCessor function
// TWO times to the starting value of THREE
return `2 + 3 = ${to_integer(TWO(SUCC)(THREE))}`
}
Insert cell
Insert cell
ADD_MAGNITUDES = qtyFn1 => qtyFn2 => qtyFn1(lib.SUCC_MAGNITUDE)(qtyFn2)
Insert cell
SUBTRACT_MAGNITUDES = qtyFn1 => qtyFn2 => qtyFn2(lib.PRED_MAGNITUDE)(qtyFn1)
Insert cell
Insert cell
_IS_LTE = val1 => val2 => lib.IS_ZERO(lib.SUBTRACT(val1)(val2))
Insert cell
Insert cell
to_integer = number => lib.magnitude(lib.ABS(number)) * lib.IS_POS(number)(1)(-1)
Insert cell
IS_LTE = num1 => num2 => to_integer(num1) <= to_integer(num2) ? lib.TRUE : lib.FALSE
Insert cell
Insert cell
ADD =
num1 =>
num2 =>
// Inner function
(qtyFn1 => qtyFn2 =>
// Is the 1st number +ve?
lib.IS_POS(num1)
// Yup, what's the sign of the 2nd number?
(lib.IS_POS(num2)
// Both numbers are +ve
// Return sum of magnitudes and +ve sign
(lib.NUMBER(lib.TRUE)(ADD_MAGNITUDES(qtyFn1)(qtyFn2)))

// 2nd number is -ve
// Which number is bigger?
(IS_LTE(num1)(num2)
// 1st number is bigger
// Subtract 2nd number from 1st and return with +ve sign
(lib.NUMBER(lib.TRUE)(SUBTRACT_MAGNITUDES(qtyFn1)(qtyFn2)))

// 2nd number is bigger
// Subtract 1st number from 2nd and return with -ve sign
(lib.NUMBER(lib.FALSE)(SUBTRACT_MAGNITUDES(qtyFn2)(qtyFn1)))))
// Nope, so is the 2nd number +ve?
(lib.IS_POS(num2)
// 2nd number is +ve
// Which number is bigger?
(IS_LTE(num1)(num2)
// 2nd number is bigger
// Subtract 1st number from 2nd and return with +ve sign
(lib.NUMBER(lib.TRUE)(SUBTRACT_MAGNITUDES(qtyFn2)(qtyFn1)))

// 1st number is bigger
// Subtract 2nd number from 1st and return with -ve sign
(lib.NUMBER(lib.FALSE)(SUBTRACT_MAGNITUDES(qtyFn1)(qtyFn2))))
// Both numbers are -ve
// Return sum of magnitudes with -ve sign
(lib.NUMBER(lib.FALSE)(ADD_MAGNITUDES(qtyFn1)(qtyFn2))))
)
// Extract the numbers' absolute values and pass them to the above inner function
(lib.ABS(num1))
(lib.ABS(num2))
Insert cell
Insert cell
Insert cell
{
return {
"ONE_plus_THREE" : to_integer(ADD(lib.PLUS_ONE)(lib.PLUS_THREE))
, "TWO_plus_MINUS_FIVE" : to_integer(ADD(lib.PLUS_TWO)(lib.MINUS_FIVE))
, "MINUS_ONE_plus_THREE" : to_integer(ADD(lib.MINUS_ONE)(lib.PLUS_THREE))
, "MINUS_ONE_plus_MINUS_THREE" : to_integer(ADD(lib.MINUS_ONE)(lib.MINUS_THREE))
}
}
Insert cell
Insert cell
SUBTRACT =
num1 =>
num2 =>
ADD(num1)
(lib.NUMBER(lib.NOT(lib.SIGN(num2)))(lib.ABS(num2)))
Insert cell
Insert cell
{
return {
"ONE_minus_THREE" : to_integer(SUBTRACT(lib.PLUS_ONE)(lib.PLUS_THREE))
, "TWO_minus_MINUS_FIVE" : to_integer(SUBTRACT(lib.PLUS_TWO)(lib.MINUS_FIVE))
, "MINUS_ONE_minus_THREE" : to_integer(SUBTRACT(lib.MINUS_ONE)(lib.PLUS_THREE))
, "MINUS_TWO_minus_MINUS_THREE" : to_integer(SUBTRACT(lib.MINUS_TWO)(lib.MINUS_THREE))
}
}
Insert cell
to_integer(lib.SUBTRACT(lib.PLUS_TWO)(lib.MINUS_ONE))
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more