에 다형성 함수를 적용 고차 함수를 정의 id 0
는 만드는, 0
로 평가하는 방법 완벽한 감각.그런 다음 자연스럽게 <code>id</code>은 물론 <code>'a -> 'a</code></p> <p>을 입력했다, 내가</p> <pre><code>fun id x = x </code></pre> <p>를 정의하면 특정 유형의
이 완벽 의미가 있기 때문에, 나는 기능하여 캡슐화 할 수 있어야한다 : applyToZero
유형 ('a -> 'a) -> int
을하고 때 applyToZero id
가 0
을 평가하지만 것이라는 희망으로
fun applyToZero (f: 'a -> 'a) = f 0
위와 같이 applyToZero
을 정의하려고하면 SML/NJ가 시작하는 이상한 오류 메시지를 표시합니다.
unexpected exception (bug?) in SML/NJ: Match [nonexhaustive match failure]
raised at: ../compiler/Elaborator/types/unify.sml:84.37
이것은 거의 컴파일러 자체의 버그처럼 보입니다. 이상하지만 가능합니다.
그러나 PolyML 중 하나를 좋아하지 않는다 (의 오류 메시지가 덜 이상한하지만) : 유추 유형 ('a -> 'a) -> int
와
fun ignoreF (f: 'a -> 'a) = 1
:
> fun applyToZero (f: 'a -> 'a) = f 0;
poly: : error: Type error in function application.
Function: f : 'a -> 'a
Argument: 0 : int
Reason: Can't unify int to 'a (Cannot unify with explicit type variable)
Found near f 0
다음 작업을 수행합니다. 이것은이 유형의 고차 함수를 생성하는 것이 불가능하지 않다는 것을 보여줍니다.
왜 SML은 내 정의 applyToZero
을 허용하지 않습니까? 해당 유형을 ('a -> 'a) -> int
되도록 정의 할 수있는 해결 방법이 있습니까?
동기 부여 : this question의 퍼즐을 해결하기 위해 내 시도에, 나는 모든 정수 n
에 대한 유형 int -> 'a -> 'a
의 함수 tofun
원하는 특성 fromfun (tofun n) = n
또 다른 기능 fromfun
을 정의 할 수 있었다. 그러나 내 작업 fromfun
의 추론 된 유형은 ('int -> 'int) -> 'int)
입니다. SML이 ('a -> 'a) -> int
으로 받아 들일 수 있도록 형식 주석을 추가하려는 모든 시도가 실패했습니다. fromfun
이라는 내 정의를 보여주고 싶지 않습니다. 그 질문을 한 사람이 여전히 그 퍼즐에서 작업하고있을 수도 있기 때문입니다. 그러나 applyToZero
의 정의는 똑같은 오류 메시지를 유발합니다.
하스켈은 Andreas가 설명하는 상위 등급 유형을 지원합니다. [여기에 몇 가지 실용적인 사례가 있습니다] (http://stackoverflow.com/questions/1476480/what-uses-have-you-found-for-higher-rank-types-in-haskell) [StackOverflow]. 보조 부대 : SML에는 유형 수준 기능 (또는 종속 유형)이 없으므로 SML의 유형에 기능을 적용 할 수 없습니다. –