이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
김진산
가입: 2006년 9월 13일 올린 글: 45
|
올려짐: 2007년11월18일 20:37 주제: [질문] 주어진 sort.m의 simple type check |
|
|
주어진 sort.m 예제에는 아래와 같은 코드가 있습니다.
코드: |
val print2 = fn x =>
let val a = x.1
val b = x.2
in
write a; write b
end
|
write의 argument는 int, bool, string 이 될 수 있기에
a와 x.1의 type inference에 실패하게 됩니다.
결국 sort.m은 제가 구현한 simple type system에서는 reject 당하게 됩니다.
polymorphic type system을 도입하기 전에는 불가능해 보이는데,
제가 잘 못 이해하고 있는건지 모르겠습니다.
이번에 제출하는 type system이 주어진 sort.m 예제를 accept 해야 하는 것인가요?
(뿐만 아니라 현재 제 type system에서는, 함수의 argument가 오직 write 함수의
인자로만 쓰인 경우에는 추론 불가로 reject 합니다만!
이러한 동작도 정상 동작으로 받아들여질 만한 것인지 궁금합니다.) |
|
위로 |
|
|
정영범
가입: 2005년 9월 5일 올린 글: 167
|
올려짐: 2007년11월20일 17:49 주제: |
|
|
결론부터 말씀드리면 받아들일 수 있어야 합니다.
write는 M의 정의에 나와있는 대로 int, bool 혹은 string를 받아서 그 타입 그대로 돌려주는 구문입니다. 이 조건을 만족시키는 지만 체크하면 되기 때문에 문제 없습니다. 문제에 나와 있는 print2 함수 같은 경우는 사용되는 곳을 보면 인자의 타입이 int tuple인 것을 알 수 있습니다. 따라서, (int * int ) -> int 타입이라고 유추가 됩니다. 이렇게 타입이 고정되도 사용되는 곳에서는 항상 이 타입으로만 쓰이기 때문에 문제가 없습니다.
문제가 되는 경우는 다음과 같습니다.
예를 들어 같은 예제 프로그램에서
val write2 = fn x=> write x
를 정의하고, write가 나타나는 곳을 모두 write2로 대치한다면 문제가 발생합니다.
write2의 인자의 타입을 어느 primitive type 하나로 고정할 수 없기 때문입니다(쓰이는 곳에 따라 변하므로). |
|
위로 |
|
|
김진산
가입: 2006년 9월 13일 올린 글: 45
|
올려짐: 2007년11월20일 18:13 주제: |
|
|
그렇군요!
type inference를 function body 마다 따로 하고 있었는데~
program 전체로 equation을 만들면 unify 문제가 풀리겠다~ 라고 생각만 하고
주말 이후 다른 숙제 때문에 손을 못대고 있었는데~
역시~ program 전체를 scan해야 하는 것이군요.
저와 같은 실수를 하신 분이 많지는 않으실 것 같지만~
참고가 되었으면 합니다.
답변해주신 조교님께 감사드립니다. |
|
위로 |
|
|
|