2012-07-31 4 views
5

ocaml 프로젝트에서 작업하는 동안 실제로 이해할 수없는 것을 발견했습니다.ocaml의 모듈 식 프로그래밍

OCaml 표준 라이브러리의 과 List 모듈을 모두 사용한다고 가정합니다. 둘 다 함수 length을 구현하지만 유형은 다릅니다. List 모듈에서 , 이것은 그 유형 :

length: a' list -> int 

그리고 Array 모듈, 그것은 유형이 있습니다

length: a' array -> int 

을하지만 난 당신이 내가했다 동일한 모듈에 두 모듈을 사용하여 원 open 키워드를 통해 구현 :

open List 
open Array 

난에 length 기능을 사용하려고 할 때 목록에서 컴파일하는 동안 유형 오류가 발생했습니다.
OCaml은 강력한 정적 형식 언어이기 때문에 컴파일러가 왜 내가 둘 다 사용한다고 선언했기 때문에 목록 모듈의 길이 함수가 필요하다는 것을 알지 못했습니다.

+1

"컴파일러가 왜 내가리스트 모듈의 길이 함수를 원한다는 것을 몰랐는지 궁금합니다. 왜냐하면 내가 '예, 그렇지만'fun s -> length s'의 타입이 될 것이라고 선언했기 때문입니다. 이 맥락? –

+0

jrouquie의 답을 바탕으로, 그것은'a 'array -> int' 일 것입니다. –

+1

정확하게 추측하려고 시도한 가설적인 OCaml 컴파일러의 경우, OCaml 타입 시스템에는 가장 일반적인 타입이 하나도 없을 것입니다 함수에 대한. 이 괴롭힘에 대한 하스켈의 해결책에 관심이있을 수 있습니다. 클래스를 입력하세요 : http://www.haskell.org/tutorial/classes.html –

답변

8

OCaml은 유형에 따라 하나의 함수 또는 다른 함수를 선택하지 않습니다.

같은 이름을 가진 모듈 List의 사람을 마스킹하는 모듈 Array

open Array 

기능을 쓸 때. 나중에 length 함수를 호출하면 OCaml은 length이라는 함수를 찾고 Array.length을 찾고이 함수에 호환 가능한 형식이 없다고 불평합니다.

평소에는 List.length (단지 length 대신)으로 전화를 걸어 필요한 기능을 수행합니다.


더 일반적으로 OCaml은 이름 추론을 훨씬 어렵게 만들기 때문에 이름 오버로딩 (즉, 동일한 이름이지만 별개의 인수 유형을 가진 두 개의 함수 또는 연산자가 있음)이 없습니다.

+2

: 모듈 열기를 피하십시오. 독자가 어떤 모듈이 열려 있고 어떤 순서로되어 있는지 기억해야하기 때문에 코드 읽기가 훨씬 어려워집니다. 또한 독자로서 당신은 기능이 어디서 왔는지 즉시 깨닫지 못합니다. – lambdapower

+2

사용하는 값 ​​/ 함수의 출처가 명확한 경우 개통 모듈이 좋음을 추가하고 싶습니다. 따라서 List 나 Array 같은 모듈을 일반 이름을 가진 함수를 제공하지 마십시오. 그러나 printf, fprintf 등의 함수를 제공하기 때문에 "open printf"라는 함수는 매우 유용합니다. –