Skip to content

Instantly share code, notes, and snippets.

@parkjinwoo
Last active December 24, 2015 01:29
Show Gist options
  • Save parkjinwoo/6724136 to your computer and use it in GitHub Desktop.
Save parkjinwoo/6724136 to your computer and use it in GitHub Desktop.
Functional Programming

Can Your Programming Language Do This?

blah

console.log("Imagine There's No Heaven");
console.log("Imagine There's No Countries");
console.log("Imagine There's No Possessions");

Function

function ImagineNo(things) {
  console.log("Imagine There's No " + things);  
}

ImagineNo("Heaven");
ImagineNo("Countries");
ImagineNo("Possessions");

blah

Say("Hakuna");
Say("Matata");
Say("Pole Pole");
console.log("Magic Word: Hakuna Matata Pole Pole");

Sing("Bibbidi");
Sing("Bobbidi");
Sing("Boo");
console.log("Magic Word: Bibbidi Bobbidi Boo");
function Say(s) {
  console.log("Say: " + s);
}

function Sing(s) {
  console.log("Sing: " + s);
}

Passing A Function As An Argument

function MagicWord(s1, s2, s3, fn) {
  fn(s1);
  fn(s2);
  fn(s3);
  console.log("Magic Word: " + s1 + " " + s2 + " " + s3);
}

MagicWord("Hakuna", "Matata", "Pole Pole", Say);
MagicWord("Bibbidi", "Bobbidi", "Boo", Sing);

Anonymous Function

MagicWord("Hakuna", "Matata", "Pole Pole", function(s) { console.log("Say: " + s); });
MagicWord("Bibbidi", "Bobbidi", "Boo", function(s) { console.log("Sing: " + s); });

blah

var arr = [1, 2, 3, 4, 5];

for (var i = 0; i < arr.length; i++) {
  arr[i] *= 2;
}

for (var i = 0; i < arr.length; i++) {
  console.log(arr[i]);
}

Map

function map(fn, arr) {
  for (var i = 0; i < arr.length; i++) {
    a[i] = fn(a[i]);
  }
}

var arr = [1, 2, 3, 4, 5];
map(function(x) { return x * 2; }, arr);
map(console.log, arr);

blah

function sum(arr) {
  var s = 0;
  for (var i = 0; i < arr.length; i++) {
    s += arr[i];
  }
  return s;
}

function join(arr) {
  var s = "";
  for (var i = 0; i < arr.length; i++) {
    s += arr[i];
  }
  return s;
}

Reduce

function reduce(fn, arr, init) {
  var arr = init;
  for (var i = 0; i < arr.length; i++) {
    a = fn(s, a[i]);
  }
  return a;
}

function sum(arr) {
  return reduce(function(a, b) { return a + b; }, arr, 0);
}

function join(arr) {
  return reduce(function(a, b) { return a + b; }, arr, 0);
}

Functional Programming Basics

Functional programming is programming without assignment statements.
함수형 프로그래밍은 대입문(할당)이 없는 프로그래밍이다.

Java

public class Squint {
  public static void main(String args[]) {
    for (int i=1; i<=25; i++)
      System.out.println(i*i);
  }
}

Clojure

(take 25 (squares-of (integers)))

Referential Transparency
참조 투명성

(take 25 (squares-of (integers)))

The function call (integers) returns (1 2 3 4 5 6 ...)

(take 25 (squares-of (1 2 3 4 5 6 ...)))

The function call (squares-of (1 2 3 4 5 6 ...)) returns (1 4 9 16 25 36 49 64 ...)

(take 25 (1 4 9 16 25 36 49 64 ...))

ex) call (take 3 [1 2 3 4 5 6]) returns (1 2 3)
Actual Results

(1 4 9 16 25 36 49 64 ... 576 625)

Side Effect

referentially opaque

globalValue = 0;
integer function rq(integer x)
begin
  globalValue = globalValue + 1;
  return x + globalValue;
end

referentially transparent (deterministic function)
rt(x) = rt(y) if x = y

integer function rt(integer x)
begin
  return x + 1;
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment