예. 이것을 "사전 통과 스타일"이라고합니다. 나는 약간 특히 까다로운 일을하고 경우에 사전 전달이 더 강력하기 때문에 때때로, I는 typeclass 스크랩 및 사전으로 바꿀 필요가 1 개념적으로 간단한 코드 모양은 매우 복잡하고, 또 종종 매우 성가신. 필자는 Haskell이 아닌 언어에서 사전 전달 스타일을 사용하여 유형 클래스를 시뮬레이트합니다.
물론 표현력에 차이가있을 때마다 절충이 발생합니다. 지정된 API를 DPS를 사용하여 작성된 경우 더 많은 방법으로 지정된 API를 사용할 수 있지만 API는 할 수없는 경우 자세한 정보를 얻습니다. 이것이 실제로 나타나는 한 가지 방법은입니다 Data.Set
. 이는 Ord
유형 당 하나의 사전 만 있다는 사실에 의존 합니다. Set
매장의 요소에 따라 분류 Ord
하면 하나 사전에 세트를 구축하고 다른 하나를 사용하여 요소를 삽입, DPS 가능한 것, 당신이 깰 수 있다면, 그리고 Set
의 불변과 충돌이 발생합니다. 이 고유성 문제는 팬텀 존재를 사용하여 완화 할 수 있습니다API에 상당히 성가신 복잡성을 희생시키면서 사전을 표시하기 위해 입력합니다. 이것은 Typeable
API 에서도 거의 같은 방식으로 나타납니다 .
고유성 비트는 자주 나타나지 않습니다. 타입 클래스에서 가장 좋은 것은 코드를 작성하는 것입니다. 예를 들어
catProcs :: (i -> Maybe String) -> (i -> Maybe String) -> (i -> Maybe String)
catProcs f g = f <> g
입력을 받아 출력을 제공 할 수있는 두 개의 "프로세서"가 필요하며이를 병합하여 병합하면 Nothing
다음과 같은 DPS로 작성되어야합니다.
catProcs f g = (<>) (funcSemi (maybeSemi listSemi)) f g
우리는 타입 시그니처에서 이미 철자를 썼음에도 불구하고 본질적으로 다시 사용하는 타입을 철자해야했습니다. 심지어 컴파일러가 이미 모든 타입을 알고 있기 때문에 중복되었습니다. 주어진 Semigroup
타입에서 주어진 것을 구성하는 유일한 방법이 있기 때문에 , 컴파일러는 당신을 위해 그것을 할 수 있습니다. 이것은 많은 매개 변수 인스턴스를 정의하고 Data.Functor.*
결합 자에서와 같이 계산하기 위해 유형의 구조를 사용하기 시작할 때 "복합 관심"유형 효과를 가지며, 이는 deriving via
본질적으로 모든 것을 얻을 수 있는 위치 에 큰 영향을 미칩니다 . 당신을 위해 쓰여진 당신의 타입의 "표준"대수 구조.
그리고 MPTC와 자금 조달을 시작하지 마십시오. 정보를 유형 검사 및 추론에 다시 제공합니다. 나는 그런 것을 DPS로 변환하려고 시도하지 않았습니다. 많은 유형 평등 증명을 통과해야한다고 생각합니다. 그러나 어쨌든 나는 그것이 편한 것보다 뇌에 훨씬 더 많은 일이 될 것이라고 확신합니다 와.
-
1 U 를 사용하지 않으면 reflection
전원이 동등 해지지 만 reflection
사용하기가 번거로울 수 있습니다.