JS Function Contravariance

by Hyunsok Oh

JavaScript

function logg(m, linebreakbefore=false) {
  let e = document.createElement("p")
  let t = document.createTextNode(m)
  e.appendChild(t)
  if(linebreakbefore) {
    document.body.appendChild(document.createElement("br"))
  }
  document.body.appendChild(e)
}

class Animal {
  constructor(n) { this.name = n }
  printName() { logg(this.name) }
}

class Dog extends Animal {
  bark() { logg("Bow Wow!") }
}

function dogFun(a) {
  a.bark()
}

function animalFun(a) {
  a.printName()
}

let d = new Dog("mary")
let a = new Animal("king")

function applyToD(f) { // 여기서 f는 Dog를 인자로 받는 함수
  f(d)
}

function applyToA(f) { // 여기서 f는 Animal을 인자로 받는 함수
  f(a)
}

logg("Dog->undefined에 당연히 Dog->undefined 타입 사용 가능",true)
applyToD(dogFun)
logg("Dog->undefined대신 Animal->undefined 타입 사용 가능",true)
applyToD(animalFun)
try {
  logg("Animal->undefined대신 Dog->undefined 타입 사용 불!!가능",true)
  applyToA(dogFun)
} catch(e) {
  logg(`error while applyToA(dogFun):`)
  logg(e)
}

logg("Animal->undefined에 당연히 Animal->undefined 타입 사용 가능",true)
applyToA(animalFun)