문제

높은 순위 유형은 큰 재미처럼 보입니다. 로부터 Haskell Wikibook 이 예제가 온다 :

foo :: (forall a. a -> a) -> (Char,Bool)
foo f = (f 'c', f True)

이제 우리는 평가할 수 있습니다 foo id 컴파일러가 폭발하지 않고. 이 예는 책에서 내가 다른 몇 곳에서 본 실제 예제로 세인트 모나드와 runST. 꽤 괜찮은데.

그러나 나는 아직 더 높은 순위의 주장으로 내 자신의 기능을 작성하여 문제를 해결하는 상황을 아직 접근하지 못했습니다. 당신이 있습니까? 야생에서 Rank-2 또는 Rank-N 다형성에 대한 어떤 예가 있습니까?

도움이 되었습니까?

해결책

같은 기능을 살펴보십시오 withRepoLock 에서 DARCS 소스.

DARCS는 여러 저장소 형식을 지원하며 해당 지원은 TypeClass를 통해 표현됩니다. 따라서 저장소 형식보다 일반적인 코드를 작성할 수 있습니다. 실제로 온 디스크 리포지토리를 읽을 때 리포지토리가 어떤 형식을 파악하고 올바른 유형의 인스턴스화를 선택하는 일부 공통 코드를 통해 해당 코드로 발송하려고합니다.

다른 팁

Weirich와 Washburnn의 "Boxes Go Bananas"! (종이, 슬라이드)

여기에 모든 것이 무엇인지에 대한 매우 조잡하고 약간 부정확 한 설명이 있습니다. 유도 성 유형을 감안할 때 BGB는 "긍정적 인"유형의 기능 공간을 표현할 수 있습니다. 최대는 다른 값의 일부로 그들의 주장을 포함합니다 (일반적으로 같은 유형).

Weirich+Washburn이 이것을 사용하여 아마도-적절한 람다 미적분학의 HOAS 표현 -XRankNTypes Haskell (아무도 아직 충분히 입증 되었습니까?).

내가 사용할 게 여기 (경고 : 지저분한 코드) a

(forall g . GArrow g => g () x -> g () y)

a

(forall g . GArrow g => g x y)

이것은 Rank-2 polymorphic 유형이 그 주장의 구조를 "검사"할 수 없기 때문에 작동합니다. 논쟁을 더 큰 구조로 "붙여 넣는"것입니다. 일부 속임수는 붙여 넣기가 어디에서 발생하는지 파악하고, 나는 목장 지점 (들)을 GArrow.

당신은 이것을 할 수 없습니다 Control.Arrow 클래스, 전체 Haskell 함수 공간이 "누출"하기 때문에 arr.

최근에 누군가 스택 오버플로에 대한 질문을했습니다 높은 순위 유형으로 해결할 수 있습니다.

다른 응용 프로그램은 보일러 플레이트를 폐기하십시오 종이.

높은 순위가 높은 유형이 유용한 문제를 겪었지만 실현하지 못했을 수도 있습니다. 예를 들어 DARCS 예에서는 높은 순위가없는 유형없이 쉽게 구현할 수있었습니다. 대신 발신자가 리포지토리 형식에 대한 함수의 올바른 인스턴스화를 선택하는 것과 같이 호출자가 준수 해야하는 일부 함수에 대한 전제 조건이 있었을 것입니다.

순위가 높은 유형의 장점은 프로그래머에서 컴파일러로이를 바로 잡을 책임이 있다는 것입니다. 기존의 접근 방식을 사용하면 DARCS 개발자가 저장소 유형으로 실수를 한 경우 결과는 런타임 오류이거나 다른 데이터가 손상되었습니다. 순위가 높은 유형의 경우 개발자는 컴파일 타임에 유형 오류를 얻습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top