row polymorphism

Jason Kim·2021년 2월 25일
0
post-custom-banner

row polymorphism은 structural subtyping을 떠오르게 하지만 둘은 다르다.

let f x = x with {sum: x.a + x.b}
let answer = f {a: 1, b: 2, c: 100}

-- 위와 같은 코드가 있을때 아래와 같이 추론된다.
-- subtyping
f :: {a: Number, b: Number} -> Number
answer :: {a: Number, b: Number, sum: Number }

-- row polymorphism
f :: {a: Number, b: Number | ρ} -> Number
answer :: {a: Number, b: Number, c: Number, sum: Number}

row polymorphism은 ρ가 c: Number를 포함하도록 인스턴스화 되고 이것은 타입 추론이 가능해진다. 그리고 정보를 잃지 않는다.

일반적인 OOP언어에서는 subtyping이 사용되고 이것은 up-casting되기 때문에 정보를 잃게된다.

OCaml과 purescript는 row polymorphism을 지원한다.

더 읽어보기

https://brianmckenna.org/blog/row_polymorphism_isnt_subtyping
https://news.ycombinator.com/item?id=13047934
https://www.cs.cmu.edu/~aldrich/courses/819/slides/rows.pdf

post-custom-banner

0개의 댓글