 |
|
이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
남예현
가입: 2018년 9월 11일 올린 글: 2
|
올려짐: 2018년9월18일 1:57 주제: 2-4) 모듈 타입과 모듈의 사용법에 대해 질문이 있습니다. |
|
|
안녕하세요, 조교님.
과제 2-4 를 풀기 위해 연습 코드를 작성하던 중 의문이 생겨 질문 드리게 되었습니다.
아래와 같은 코드를 작성해서 인터프리터로 실행하였습니다.
두 모듈은 삽입만 가능한 정수 큐이고요,
둘의 내부 코드는 완전히 같지만 모듈A와 달리 모듈B는 모듈 타입을 구현했습니다.
코드: |
module type MyModuleType =
sig
type elt
type que
val emptyQ: que
val enQ: (que * elt) -> que
end
module MyModuleA =
struct
type elt = int
type que = elt list
let emptyQ: que = []
let enQ: (que * elt) -> que = fun (q, e) -> e::q
end
module MyModuleB: MyModuleType =
struct
type elt = int
type que = elt list
let emptyQ: que = []
let enQ: (que * elt) -> que = fun (q, e) -> e::q
end
let qA: MyModuleA.que = MyModuleA.emptyQ
let qB: MyModuleB.que = MyModuleB.emptyQ
let x: int = 1
let y: MyModuleA.elt = 2
(* let z: MyModuleB.elt = 3 *)
|
첫째로, 주석처리 된 마지막 줄과 같은 변수 선언이 불가능한 이유가 무엇인가요?
둘째로,
코드: |
MyModuleA.enQ (qA, x);;
MyModuleA.enQ (qA, y);;
|
는 잘 작동하지만
코드: |
MyModuleB.enQ (qB, y);;
|
는 에러인 이유가 무엇인가요?
두 질문이 비슷한 내용인 것 같지만 Ocaml 사용이 미숙해서 질문 드리게 되었습니다.
감사합니다. |
|
위로 |
|
 |
로파스 Site Admin
가입: 2012년 9월 9일 올린 글: 280
|
올려짐: 2018년9월18일 20:35 주제: |
|
|
두가지 에러 모두 module type에서 elt의 타입을 명시적으로 공개하지 않아서 생기는 에러입니다.
module type에서 type elt라고만 선언되어있는데, 이것은 이러한 모듈타입을 가지는 모듈에는 elt라는 타입이 존재는 하는데, 이것이 구체적으로 어떻게 되어있는지는 드러내지 않겠다는 뜻입니다.
따라서 module type 내의 elt를 아예 int로 선언하거나, 펑터를 활용해 다른 모듈을 입력으로 받아 elt의 타입을 정의하도록 해야합니다.
전자의 경우는 elt가 임의의 타입에 대해서 잘 동작해야한다는 개념과 맞지 않으므로 쓰이지 않은 것이고, 후자의 경우는 이 문제의 의도 및 이번학기 전체 과정의 목표가 펑터 사용법을 익히는 것이 아니기때문에 따로 설명드리지는 않았습니다.
따라서 이번 숙제에서는 말씀해주신 에러들을 피하기 위해 MyModuleB처럼 모듈타입을 명시하고 구현하는 대신, 구현하신 모듈이 모듈타입에 맞는지만 확인해보시면 됩니다.
-조교 드림. |
|
위로 |
|
 |
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group Translated by kss & drssay
|