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)