OCaml (3.12.1)의 모듈 언어를 실험 중이며, 모듈에 대한 펑터와 서명을 정의하고 있습니다. 대부분 Chapter 2 of the OCaml manual의 예제를 따르면 우연히 발견하게됩니다. , 펑터와 모듈 서명이 어떻게 작동하는지에 대한 나의 정신 모델이 결함이있는 상황에서. 나는 가능한 한 가장 짧은 양의 코드로 인해 발생하는 상황을 좁히려고 노력했다. 그래서 내가 성취하려는 것을 묻지 않는다. 이것은 OCaml 기능을 시연하는 완전히 모범적 인 예이다.OCaml 펑터 :: 반 직관적 인 행동
그래서 우리는 단순히 신원 함수 'f'를 제공하고 해당 함수의 입력 매개 변수의 유형을 제공하는 모듈에 의해 매개 변수화 된 기능을 제공합니다. 내가 말한 것처럼 완전히 고안된 예. ..
module IntType = struct type t = int end ;;
그리고, 우리는 INT 식별 기능 모듈을 생성하기 위해 펑를 사용 :
module type SOMETYPE = sig type t end ;;
module Identity = functor (Type: SOMETYPE) -> struct let f (x: Type.t) = x end ;;
, 우리는 정수형 공급 모듈을 정의하는 상기 진행 감안할
module IdentityInt = Identity(IntType) ;;
물론 예상대로 충분히 생성 모듈과 F 기능 깊으
#IdentityInt.f(3) + 10 ;;
- : int = 13
모듈을 입력 모듈로 사용하는 함수 인 펑터의 정신 모델은 지금까지 우리에게 도움이되고있는 것 같습니다. Identity
functor는 시그니처 (모듈 유형) SOMETYPE의 모듈을 입력 매개 변수로 기대하며 실제로 제공된 모듈 (IntType
)은 올바른 서명을 가지므로 f
함수가 예상대로 작동하는 유효한 출력 모듈 (IdentityInt
)이 생성됩니다.
이제 직관적이지 않은 부분이 있습니다. 제공된 모듈 IntType
이 참으로 SOMETYPE 유형의 모듈이라는 것을 명시하고 싶다면 어떻게해야할까요? 마찬가지로 ...
module IdentityInt = Identity(IntType) ;;
의 새로 생성 된 모듈의 f
기능을 사용하려고하자 :
module IntType : SOMETYPE = struct type t = int end ;;
다음은 펑터의 출력 모듈 이전과 같은 방법으로 생성
IdentityInt.f 0 ;;
을
REPL이 다음과 같이 불평합니다 :
"Error: This expression [the value 0] has type int but an expression was expected of type IntType.t."
어떻게 중복되지만 정확한 유형 정보를 제공하면 코드가 손상 될 수 있습니까? 경우에 있어서도 functor 모듈 Identity는 IntType
모듈을 SOMETYPE
유형으로 처리해야했습니다. 그렇다면 IntType
을 SOMETYPE
유형으로 명시 적으로 선언하면 다른 결과가 나타납니다.
두 번째 모듈 IntType에'int int' 부분이 누락되어 있습니까? – Ptival
아니요, 내 REPL 복사 붙여 넣기 양식에 오타입니다. 두번째 모듈 IntType은 올바르게 읽습니다 :'module IntType : SOMETYPE = struct type t = int end' 그리고 위에서 설명한 것과 똑같은 결과를 얻습니다. 나는 또한 오해를 피하기 위해 게시물을 편집 할 것입니다. –