이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
황인준
가입: 2013년 9월 12일 올린 글: 8
|
올려짐: 2014년12월9일 18:01 주제: loc eq, poly 타입, TypeError 질문입니다. |
|
|
1) loc eq에서 (t1 loc) = (t2 loc) 일 때 t1, t2가 같아야 한다고 하셨는데, 이때 t1과 t2의 조건은 없는 것이지요? (즉 const거나 loc 말고도, 함수나 pair 타입이 와도 상관 없죠?)
2) simple type checking과 poly type checking에서 다음 케이스는 다른 답이 나옵니다.
코드: | let val f = (fn x => x) in f 1; f true end |
simple에서는 TypeError이고, poly에서는 bool이라고 https://ropas.snu.ac.kr/phpbb/viewtopic.php?t=4734에서 말씀해주셨는데요, 다음 프로그램은 어떻게 되나요?
코드: | let val f = (fn z => z) in f 3; f end |
저는 simple에서는 int->int인데 poly에서는 타입을 결정하지 못하여 TypeError를 내도록 해놨습니다. 맞는 건가요? 아니면 poly에서도 int->int로 결정되나요?
3) 편법을 써도 되냐는 질문입니다.
soundness를 계속 강조하시는 것 같은데, https://ropas.snu.ac.kr/phpbb/viewtopic.php?t=4753에서,
인용: | 프로그램이 문제가 생겨서 죽는경우가 있다면 무조건 타입에러를 내야한다는게 soundness이고,
|
라고 하셨습니다.
그렇다면, check의 모든 과정을 try로 감싸고 error가 발생할 경우 with로 잡아서 무조건 TypeError를 내는 코드는 가능합니까? (물론 check 도중 실제 TypeError가 발견될 경우는 raise합니다.) 좋지 않은 방법이긴 하지만, 어쩌다가 다른 error가 나올 확률을 없애서 soundness 자체는 지켜질 것 같기도 합니다.
(상당히 다른 경우지만, 지난 GC 숙제에서 Unbound_loc이 나올 때 무조건 GC_Failure를 내는 꼼수를 부렸으면 어땠을까 하는 생각이 나서 이런 질문까지 드리게 되었습니다.) |
|
위로 |
|
|
강동옥
가입: 2009년 9월 18일 올린 글: 602
|
올려짐: 2014년12월9일 22:24 주제: |
|
|
1) 네 맞습니다.
2) simple에서 int -> int이면 poly에서도 int -> int로 잘 나와야 합니다.
3) 어떤 에러를 catch 하고 싶으신가요? |
|
위로 |
|
|
방정호
가입: 2011년 9월 19일 올린 글: 40
|
올려짐: 2014년12월9일 22:31 주제: |
|
|
인용: |
let val f = (fn z => z) in f 3; f end
|
이 인풋의 경우 poly 에서는 f 라는 함수의 타입이 정해지지 않으니까
(우리의 구현에서는 일반화된 alpha -> alpha 같은 타입이 없으므로)
이것은 에러를 내야 하는 거 아닌가요??
지난 https://ropas.snu.ac.kr/phpbb/viewtopic.php?t=4734 의 답변에서 보면,
인용: |
최종타입하에 출력할수 없다면 타입체킹 실패로 결론내시면 됩니다.
|
라고 답변 달아주셔서, 최종적으로 다형타입이 나오면 에러라고 이해했습니다. |
|
위로 |
|
|
황인준
가입: 2013년 9월 12일 올린 글: 8
|
올려짐: 2014년12월9일 22:50 주제: |
|
|
1. 알겠습니다. 감사합니다.
2. 방정호님도 말씀하셨듯, 저도 f의 타입이 저 시점에 결정된 것은 아니므로 정해지지 않아서 'a->'a로 생각했습니다.(그러므로 TypeError) 만일 int->int가 되어야 한다면 poly의 구현에서는 polymorphic 타입이 정해지는 매 순간 그 타입을 어딘가에 저장하는 동시에 이것이 poly 타입이라는 것 까지도 알 수 있어야 할 것 같습니다.
그리고 다음과 같은 예를 생각해볼 수 있습니다.
코드: | let val f = (fn x => x) in
let val g = (fn y => (fn x => y x)) in
f 1; g f
end
end |
만일 polymorphic 타입의 후보가 중간에 정해져서 그것이 바뀌기 전까지 계속 쓰인다면,
f 1에서 f는 int->int로 임시 지정된 상태로 어딘가에 저장되고 g f가 불린다면 f는 다른 정의가 없었으므로 여기서 f의 타입은 int->int인 상태로 들어가지 않을까요?
즉 g f의 타입이 int->int로 결정되지 않을까요?(simple에서는 그렇습니다.)
다른 예입니다.
코드: | let val f = (fn x => x) in
let val g = (fn y => (fn x => y x)) in
(g f) 1; f
end
end |
여기서는 어떤가요? 역시 simple에서는 int->int가 되는데, poly에서도 그렇게 해야 하나요?
하지만 이는 수업 시간에 배운 M, W 알고리즘만으로는 쉽지는 않아 보입니다. 그래도 이렇게 구현해야 하나요?
3. 특별히 무슨 에러 때문은 아니었고, 제가 try ~ with로 해 놓았길래 그대로 제출해도 문제가 되지 않느냐는 질문이었습니다. 혹시 문제가 된다면 바꿀 생각입니다. |
|
위로 |
|
|
방정호
가입: 2011년 9월 19일 올린 글: 40
|
올려짐: 2014년12월9일 22:59 주제: |
|
|
황인준님이 올려주신 인풋에 대해서 제가 말한대로 에러가 된다면
폴리가 심플보다 completeness 가 낮아지게 되어 좀 이상하긴 하지만 (잘 돌 수 있는 프로그램인데도 에러를 내야 하니까요)
인용: |
최종타입하에 출력할수 없다면 타입체킹 실패로 결론내시면 됩니다.
|
라는 스펙에 따라서,
'a -> 'a 같은 타입을 내줄 수 없는 상황에서는 타입체크 실패를 내도록 하다 보니 어쩔 수 없는 거 같네요. |
|
위로 |
|
|
조주연
가입: 2009년 9월 23일 올린 글: 12
|
올려짐: 2014년12월10일 0:35 주제: |
|
|
인용: | let val f = (fn z => z) in f 3; f end |
위의 프로그램이 polymorphic type check system 에서 int->int 로 결과를 낸다는 것은
polymorphic한 함수의 타입은 가장 마지막으로 Instantiation된 것의 타입이고,
만약 한번도 불리지 않았으면 타입을 결정할 수 없다.
라는 규칙으로 이해해야 하는 것인가요?
인용: | let val f = (fn z => z) in f 3; f (1,2); f true; f end |
그렇다면 이것의 타입은 bool->bool 이 되어야 할텐데..
f 는 프로그램 내에서 이미 다양한 타입으로 실행된 함수인데,
bool->bool 로 함수의 타입을 한정하는 것이
올바른 타입체킹인것인지 잘 모르겠습니다.
이미 제출하고 듀가 지난 상황에서 이 글을 봐서 약간 혼란스럽네요 ㅠ |
|
위로 |
|
|
황인준
가입: 2013년 9월 12일 올린 글: 8
|
올려짐: 2014년12월10일 1:13 주제: |
|
|
이미 듀가 지나서 질문 하나만 더 드리겠습니다. 만일 말씀하신 대로 질문2의 답이 poly에서도 int->int가 되어야 한다면, 채점하실 때
"이런 경우에 대해 TypeError를 내는 것으로 인한 감점"
과
"이런 경우까지 커버하지만 딜레이로 인한 감점"
중 어느 것이 더 큰가요? 실제로 polymorphic type의 정의와 completeness 등을 제대로 따져서 알고 넘어가는 것이 바람직하겠지만(제가 제대로 알고 있었다면 좋았겠죠..) 아무래도 숙제 점수를 신경쓰지 않을 수가 없네요. 앞서 드린 질문에 대한 대답은 천천히 해주시고(대신 언젠가 꼭 해주시기 부탁드립니다.) 오히려 이 질문에 대한 대답은 내일 중(딜레이 기간 내?)으로 해주시면 좋겠습니다.
감사합니다. |
|
위로 |
|
|
강동옥
가입: 2009년 9월 18일 올린 글: 602
|
올려짐: 2014년12월10일 14:32 주제: |
|
|
아 해당케이스는 alpha -> alpha로 유추되었어야하는 케이스이군요.
제가 잠시 헷갈렸습니다.
여러분이 불이익이 가지 않도록 채점하겠습니다.
죄송합니다. |
|
위로 |
|
|
황인준
가입: 2013년 9월 12일 올린 글: 8
|
올려짐: 2014년12월10일 17:41 주제: |
|
|
답변 감사합니다. |
|
위로 |
|
|
|