Security News
Weekly Downloads Now Available in npm Package Search Results
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
@f0rr0/church-encoding
Advanced tools
Church encodings for JavaScript primitives
This is a thought exercise in functional programming to represent most of the javascript primitives using only lambdas (anonymous functions). It's not intended to be used in any production user facing software.
I was informally introduced to this idea by watching this talk by John Hughes which is based on his paper. This talk by Philip Walder brilliantly explains this in a more historical context. The SICP book also introduced me to using lambdas and recursive constructs to define operations on lists. There are many more comprehensive implementations in typed functional languages but I wanted to see how far I could go without a formal type system and combinators. Ultimately, on a more philosophical note, this exercise sufficiently proves that:
Mathematics is not invented. It is discovered.
npm install @f0rr0/church-encoding@latest
or if you're using yarn
yarn add @f0rr0/church-encoding@latest
There are 3 different builds in commonjs
, umd
and esmodule
format, should you have a preference or environment constraints. Normally, modern tools will automatically pick the esmodule
build which enables tree-shaking.
import {
cons,
emptyList,
zero,
inc,
map,
mul,
decodeInteger,
decodeList
} from '@f0rr0/church-encoding';
const one = inc(zero);
const two = inc(one);
const list = cons(zero, cons(one, cons(two, emptyList)));
const listOfNative = map(decodeInteger, list);
console.log(decodeList(listOfNative)); // [0, 1, 2]
const doubleList = map(i => mul(two, i), list);
const doubleListOfNative = map(decodeInteger, doubleList);
console.log(decodeList(doubleListOfNative)); // [0, 2, 4]
The API is organized into five parts which progressively build on each other. However, since everything is a function, they are not namespaced into separate exports. The function names pretty much sum up what they do.
I still have to work on implementing rational numbers so that integer division can work. There are no throw
or Error
statements in the codebase since I strived to only use lambdas. Therefore, you need to be careful to not do mathematically impossible stuff e.g. divide a natural number by zeroNat
, or else you'd be presented with a cryptic error.
FAQs
Church encodings for primitives
The npm package @f0rr0/church-encoding receives a total of 0 weekly downloads. As such, @f0rr0/church-encoding popularity was classified as not popular.
We found that @f0rr0/church-encoding demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
Security News
A Stanford study reveals 9.5% of engineers contribute almost nothing, costing tech $90B annually, with remote work fueling the rise of "ghost engineers."
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.