코세라 스칼라 강좌 4.4 Variance 중.
Typing Rules for Functions
If A2 <: A1 and B1 <: B2 then
(A1 => B1) <: (A2 => B2)
뭔 소린지 전혀 몰라서 수시간을 고민해보다가 stackoverflow 보고 이해
원문 주소는 https://stackoverflow.com/questions/41098105/subtyping-between-function-types 여기
내가 이해한 방식으로 정리한다.
1. subtype 이다?
- subtype 이란건 'a 는 b 이다' 의 is - a 관계가 성립하는거.
2. (A1 => B1) <: (A2 => B2) 임을 증명하려면
- '(A1 => B1) 함수(이하 F1)는 (A2 => B2) 함수(이하 F2)다' 가 증명되면 됨.
'F1 는 F2 이다 ' 가 true 가 되려면 필요한 규칙은
F2(a) 를 F1(a) 로 바꿔도 에러 없이 정확한 값이 나와야 한다는 소린데(리스코프의 치환 원칙), 이소리는 즉
1. F2 의 모든 input 이 F1 에서 에러가 없어야 함
2. F1 의 모든 output 이 F2 의 output 이 되어야 함
저 규칙에 맞나 보면
1. F2 의 모든 input 이 F1 에서 에러가 없어야 함
-> 만족한다. A2(F2 의 input) <: A1 (F1 의 input) 이기 때문에, A2 는 A1 의 부분집합이고, A2의 모든 원소는 A1 이다.
2. F1 의 모든 output 이 F2 의 output 이 되어야 함
-> 만족한다. B1(F1 의 output) <: B2(F2 의 output) 이기 때문에 B1 은 B2 의 부분집합이고, B1 의 모든 원소는 B2 이다.
이 때문에 'F1 은 F2 이다' 는 참이고, F1 은 F2 의 subtype 이다.
맞나 이거?
'프로그래밍 > Scala' 카테고리의 다른 글
[Slick] DateTime 로딩 시 오류. (0) | 2020.04.05 |
---|---|
Scala 로 뭔가 만들기 위해 필요한 것. (0) | 2020.03.18 |
akka 초반 간략정리. (0) | 2020.02.09 |
Covariant, Contravariant 그림으로 다시 정리 (0) | 2020.02.02 |
Covariant, Contravariant 정리 (0) | 2020.02.02 |
scala implicit keyword 관련 - 파라미터 (0) | 2019.11.17 |
[스칼라] Slick 오류 처리 (0) | 2017.03.26 |
[스칼라] 커링(Currying) - 아마도 첫번째 글. (0) | 2017.02.26 |