이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
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에는 장착되어있지 않습니다. |
|
위로 |
|
|
|