게시판 인덱스

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

암시적 형변환 문의드립니다...

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2009)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
현철
손님





올리기올려짐: 2009년9월26일 21:18    주제: 암시적 형변환 문의드립니다... 인용과 함께 답변

숙제 5번을 짜다가 신기한 현상을 발견했는데요

match a with
| SIGMA( ( a : exp ), ( b : exp ), ( c : exp ) ) -> if( a > b )

이런식으로 했는데 a와 b가 타입체커에서 에러가 나지 않더라구요..

그리고 알아서 적절히 잘 변환을 하는 것 같던데..

어떤 과정으로 불리는지 혹은 어떻게 하면 그 과정을 찾아 볼 수 있는지

힌트 부탁드립니다^^...

감사합니다~
위로
허기홍



가입: 2007년 9월 27일
올린 글: 231

올리기올려짐: 2009년9월27일 0:22    주제: 인용과 함께 답변

타입 체크에서 에러가 나지 않는것은

http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html
여기에 > 정의를 보시면 알 수 있습니다.
> 는 'a 타입 인자 두개를 받네요. 전에 말씀드렸던 다형타입 함수 입니다.
따라서 두 인자의 타입이 같으면 일단 타입 에러는 나지 않습니다.


테스트 해보기론
INT 4> INT 3 처럼 내부에서 같은 타입을 쓰는 값들은 제대로 비교를 하네요.
하지만 X > INT 4 같은 식은 타입 에러는 나지 않지만 무조건 false라고 나오고요.

이것을 임시적 형변환이라고 보기에는 무리가 있습니다. 형을 변환한것이 아니죠. exp 타입 두개를 비교한 것일 뿐이지요. 속에 같은 타입이 들어있는 놈은 제대로 비교해준다 뿐입니다.

아시겠지만 사용자 정의타입의 비교연산은 직접 정의해야합니다.

> 이 어떻게 구현되어 있는지 찾아보고 있습니다. 거기에 답이 있겠죠.
아직 알아내지는 못하였지만 별 희한한 구현이라곤 생각치 않습니다. 여러분보고 구현하라고 해도 할수 있겠죠.

저도 궁금해졌는데 알아내면 답변 올려드리겠습니다.
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
허기홍



가입: 2007년 9월 27일
올린 글: 231

올리기올려짐: 2009년9월27일 15:09    주제: 인용과 함께 답변

ocaml 홈페이지에 가시면 소스 배포판을 구하실수 있습니다.
거기에서 모든 라이브러리 소스를 볼 수 있는데

stdlib/pervasives.ml:external (>) : 'a -> 'a -> bool = "%greaterthan"
여기를 보시면 > 는 c로 구현되어있고 c 함수 이름은 greaterthan임을 알려줍니다.

그래서 다음 경로에 가시면 c로 구현된 > 를 보실수 있습니다.

byterun/compare.c:CAMLprim value caml_greaterthan(value v1, value v2)
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
허기홍



가입: 2007년 9월 27일
올린 글: 231

올리기올려짐: 2009년9월28일 9:31    주제: 인용과 함께 답변

답변에 부족하고 잘못된 부분이 있어서 다시 정리합니다.

Ocaml에서 비교 연산자는 사용자 정의 타입에서도 사용가능합니다.
이때 크기는 선언 순서가 결정합니다.

예를 들어,
코드:
type t = A | B of t | C of int

라면

A < B (A)
B (A) < C (0)
이 모두 참입니다. 나중에 선언된 놈이 더 크지요.

재귀적으로도
B(A) < B(B(C 0))
이 참입니다.

하지만 함수가 끼면 비교가 불가능하고 예외를 발생시킵니다.

코드:
 type t = A | B of (int -> int)

라면

A < B (function x -> 1) 은 참이지만
B(function x -> 1) < B(function x -> 2) 는 비교할 수 없고 예외를 발생시킵니다.
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
현철
손님





올리기올려짐: 2009년9월28일 10:18    주제: 그렇군요!!! 인용과 함께 답변

아 그렇군요!!!

그렇다면 이전의 SUCC를 이용하여 자연수를 구하던 문제도 별도의 연산자 없이 바로 대소비교가 가능하다는 얘기군요...

>ㅁ<...

그래서 Mathmediga에 ADD를 넣어도 되었었던 것이군요.. 그렇다면 ADD의 결과값과는 상관 없이 ADD가 INT보다는 큰게 되는군요... 있다 집에 가서 실험을 해봐야겠습니다!

정말 상세하고 친절한 답변 감사합니다!!!
위로
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2009) 시간대: GMT + 9 시간(한국)
페이지 11

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


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