|
|
이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
정민규
가입: 2017년 9월 11일 올린 글: 2
|
올려짐: 2017년9월13일 22:20 주제: 함수의 타입에 관한 질문이 있습니다. |
|
|
(1)
간단히 2개의 정수를 더하는 (int * int) -> int의 함수를 선언하는 방법이 2가지가 있습니다.
1. let func1 : (int*int) -> int = fun (x,y) -> x+y
2. let func2 ((x:int), (y:int)) : int =x+y
func1의 경우에는 명시적인 함수의 타입 선언과 우변의 항 또한 (int * int) -> int라서 별 문제가 안 될 것 같습니다만, func2의 경우에는 우변과 명시적인 선언이 int입니다.(처음에 func2의 함수 타입을 적는 위치에 (int*int) -> int를 넣었더니 expression이 예상한 타입과 다르다고 error가 출력됩니다.) 만약을 위해 질문하는 건데, 이런 식으로 작성하면 채점시 문제가 발생할 가능성이 있습니까?
(2)
1-3의 경우에는 iter의 첫번째 인자 pair 중 2번째인 function과 iter의 2번째 인자의 type이 안 적혀있던데, 각각 polymorphic type ('a->'a)와 'a로 구현해야하는 게 맞습니까? |
|
위로 |
|
|
로파스 Site Admin
가입: 2012년 9월 9일 올린 글: 280
|
올려짐: 2017년9월13일 22:43 주제: |
|
|
(1)
혹시 문제가 발생하였다는 예시가
let func2 ((x:int), (y:int)) : ((int * int) -> int) =x+y
이렇게 타입을 명시해주신 경우인지요?
두번째 경우와 같이 타입을 명시하고자 하시는 경우 마지막 자리(현재 int * int -> int가 적힌 자리)에는 함수의 리턴타입이 명시되어야 합니다.
예를들자면 f라는 함수가 (a * b -> c)라는 타입이라면,
타입 명시할때는
let f ((x : a), (y : b)) : c = ...
이런 식으로 명시 및 구현하셔야 합니다.
타입 명시를 잘못한 경우에도 테스트 코드를 넣고 테스트해보면 컴파일 오류가 나게 됩니다.
즉 채점결과에 영향을 미칠 수 있습니다.
타입 명시를 하지 않더라도 숙제에서는 만점을 받을 수는 있습니다. 하지만 타입명시를 잘못해서 생기는 불이익은 테스트를 한번만 해보더라도 피해갈 수 있기 때문에, 이러한 이유로 타입 명시를 굳이 하지 않으실 필요 또한 없습니다.
(2)
맞습니다. 숙제 제출 및 보충스펙 공지에 비슷한 내용이 명시되어 있습니다. |
|
위로 |
|
|
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group Translated by kss & drssay
|