게시판 인덱스

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

이상한 타잎 매칭

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2008)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
yunku2002



가입: 2008년 9월 25일
올린 글: 6

올리기올려짐: 2008년11월27일 16:00    주제: 이상한 타잎 매칭 인용과 함께 답변

structure와 signature의 관계에서
structure에 정의된 함수에서의 타잎들이
interface에서의 그것을 포함해서 더 넓기만 하면 된다고 생각했습니다

그런데 오늘 실습한 내용에서 remove를 만드는 도중
맵 인자를 (h::t)로 받았더니 "remove 의 타입이 적응 안되기 때문"이라면서
컴파일이 되지 아니하였는데
((h as (k, v)::t)로 고쳤더니 먹히더군요
쓰이지도 않는 k와 v..
튜플의 크기가 다르면 포함이 안되기 때문이라고 생각하기에는
find에서는 이러한 명시를 안 했는데도 잘 돌아가고
그렇다면 h.1이라는 것이 쓰이지 않기 때문일텐데..
위로
사용자 정보 보기 비밀 메시지 보내기
최원태



가입: 2006년 9월 16일
올린 글: 369

올리기올려짐: 2008년11월28일 0:49    주제: 인용과 함께 답변

질문이 잘 이해되지 않는군요.
조금더 자세히 설명해 줄 수 있을까요?
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
강윤구



가입: 2008년 11월 27일
올린 글: 25

올리기올려짐: 2008년11월28일 5:14    주제: 인용과 함께 답변

코드:
structure Mapping =
struct
        type 'a map = (int * 'a) list
        val empty = []
        exception InexistenceError

        fun add set key value = (key, value)::set
        fun find [] key = raise InexistenceError
                | find (h::t) key = if h.0 = key then h.1 else find t key
        fun remove [] key = raise InexistenceError
                | remove ((h as (k, v))::t) key = if h.0 = key then t else h::remove t key
end

signature MAPPING =
sig
        type 'a map
        val empty : 'a map

        val add : 'a map -> int -> 'a -> 'a map
        val find : 'a map -> int -> 'a
        val remove : 'a map -> int -> 'a map
end

structure SigMapping = Mapping : MAPPING


(h as (k, v))::t 부분을 h::t라고만 써주면

인용:
11.n 24.23-40:
오류: 모듈 Mapping 이(가) 모듈타입 MAPPING 에 맞지 않습니다. remove 의 타입이
적응 안되기 때문입니다.
- 모듈에서는 {0: 'a} list -> 'a -> {0: 'a} list 이고
- 모듈타입에서는 'a SigMapping.map -> int -> 'a SigMapping.map 입니다.

랍디다
위로
사용자 정보 보기 비밀 메시지 보내기
최원태



가입: 2006년 9월 16일
올린 글: 369

올리기올려짐: 2008년11월28일 14:33    주제: 인용과 함께 답변

.0을 사용하면 h가 튜플이 아니라 record인 것으로 타입유추가 일어납니다.
그리고 nml에서는 = 가 여러가지 타입에 대해 사용할 수 있지요.

h as (k,v)를 쓰지 않으면 h 가 0이란 이름의 필드를 가지는 레코드라는 것만 알 수 있어요.
첫 번째 필드의 타입이 무엇인지, 다른 필드의 타입이 무엇인지 유추할 수 있는 힌트가 없습니다.
그런 상황에서는 h가 크기 2 짜리 튜플이라고 보장할 수 없기 때문에, 타입 에러를 내게 됩니다.

이런 케이스도 커버하도록 타입시스템을 확장할 수도 있습니다.
하지만 현재 nML에는 장착되어있지 않습니다.
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2008) 시간대: GMT + 9 시간(한국)
페이지 11

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


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