게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

loc eq, poly 타입, TypeError 질문입니다.

 
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2014)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
황인준



가입: 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    주제: 인용과 함께 답변

답변 감사합니다.
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2014) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay