/maTH(ə)ˈmadiks/
noun
Edsger Dijkstra, Pioneer of computer science
Edsger Dijkstra, Pioneer of computer science
David Hilbert (1925), Super famous mathematician
Norbert Wiener, Originator of Cybernetics
Alan Kay, Inventor of "OOP"
Alan Turing, Manual for Ferranti Mk. I
Attributed to Kant (not true anymore)
const p = true;
const q = p && true;
q === true // true
if this
then
that
const p = true;
const q = false;
p && (p || q) === p; // true
\( (P\vee Q) \)
\( P \wedge (P\vee Q) \)
\( Q \)
\( P \)
\( true \)
\( true \)
\( false \)
\( true \)
\( true \)
\( true \)
\( true \)
\( true \)
\( true \)
\( true \)
\( false \)
\( true \)
\( false \)
\( false \)
\( false \)
\( false \)
\( false \)
\( \neg (P \vee Q)\Longleftrightarrow(\neg P)\wedge(\neg Q) \)
\( \neg (P \wedge Q)\Longleftrightarrow(\neg P)\vee(\neg Q) \)
const p = true;
const q = false;
!p && !q === !(p || q) // true
const p = true;
const q = false;
!!p === p; // true
!!q === q; // true
const p = true;
const q = false;
p || q === true // true
q || p === true // true
Rule:
// Bad
var someValue = foo ? foo : bar;
// Good
var someValue = foo || bar;
// .eslintrc.js
module.exports = {
rules: {
'no-unneeded-ternary': 'error'
}
};
Substitute \( P \to Q \) with \( \neg P \vee Q \):
Apply "double complement law":
Simplify left side of conjunction using basic identity:
Remove left side of conjunction (\( true \) is identity for \( \wedge \)):
Write ternary using propositional logic:
\( a' \)
\( b' \)
\( c' \)
\( a \)
\( b \)
\( f: X \to Y \)
\( X \)
\( Y \)
// X = [1, 2]
// Y = [1, 2, 3, 4]
const double = x => 2 * x;
double(1) === 2 // true
double(2) === 4 // true
\( 1 \)
\( 2 \)
\( X \)
\( Y \)
\( double: X \to Y \)
\( 1 \)
\( 2 \)
\( 3 \)
\( 4 \)
\( a' \)
\( b' \)
\( a \)
\( b \)
\( c \)
\( X \)
\( Y \)
\( f: X \to Y \)
// X = [1, 2, 3]
// Y = [true, false]
const isEven = x => x % 2 === 0;
isEven(1) === false // true
isEven(2) === true // true
isEven(3) === false // true
\( true \)
\( false \)
\( 1 \)
\( 2 \)
\( 3 \)
\( X \)
\( Y \)
\( isEven: X \to Y \)
\( a' \)
\( b' \)
\( a \)
\( b \)
\( c \)
\( X \)
\( Y \)
\( f: X \to Y \)
\( c' \)
// X = [1, 2]
// Y = [2, 4]
const double = x => 2 * x;
double(1) === 2 // in Y
double(2) === 4 // in Y
\( 2 \)
\( 4 \)
\( 1 \)
\( 2 \)
\( X \)
\( Y \)
\( double: X \to Y \)
examples
example
examples
example
example
elements
identity
operation
example
// X = [1, 2]
// Y = [2, 4]
const double = x => 2 * x;
const inverse = y => y / 2;
const identity = x => inverse(double(x));
double(1) === 2 // true
double(2) === 4 // true
inverse(2) === 1 // true
inverse(4) === 2 // true
identity(1) === 1 // true
identity(2) === 2 // true
import {negate} from 'lodash';
const numbers = [1, 2, 3, 4, 5];
const lessThanTen = x => x < 10;
!(numbers.every(lessThanTen)) === !numbers.some(negate(lessThanTen)) // true
const numbers = [1, 2, 3];
numbers.reduce((sum, num) => sum + num, 0); // 6
// (Number, 0, +)
numbers.reduce((sum, num) => sum + num, ''); // '123'
// (String, '', +)
numbers.reduce((sum, num) => [...sum, num], []); // [1, 2, 3]
// (Array, [], Array.prototype.concat)
import Promise from 'bluebird';
const createTask = val => Promise
.resolve(val)
.delay(val * 100)
.then(console.log);
const numbers = [20, 5, 3, 1, 4];
numbers.reduce((sum, num) => sum.then(() => createTask(num)), Promise.resolve());
(Promise, Promise.resolve(), Promise.prototype.then)
Identity