Haskell에서 제약 조건을 파라 메트릭 newtype에 연결하여이를 사용하는 모든 클래스 인스턴스에 자동으로 적용하는 방법은 무엇입니까?

다음과 같이 정의 된 매개 변수 유형이 있다고 가정합니다.

newtype FancyComplex a b = FancyComplex (a, b)

이 새로운 유형을 숫자 매개 변수 이외의 다른 매개 변수에 사용하지 않으려 고합니다. 나는 무엇이든 내가 할 수있는 구현을 위해, 나는 그 매개 변수를 알고 있다는 것을 의미 a하고 b항상의 인스턴스가 될 것입니다 Num.

이 질문에서 당신이 이것을 할 수 있다는 것을 읽었습니다 . typeclass 제약이 newtype 정의에서 사용될 수 있습니까?

{-# LANGUAGE RankNTypes #-}
newtype (Num a, Num b) => FancyComplex a b = FancyComplex (a, b)

그러나 이것은 충분하지 않습니다. 다음과 같은 클래스를 작성하면 :

class StupidClass x where add :: x -> x -> x

그럼 내가 쓸 수있을거야

instance StupidClass (FancyComplex a b) where
    add (FancyComplex (a, b)) (FancyComplex (a', b')) = FancyComplex (a+a', b+b')

그러나 GHC는 내가 Num요구 사항을 시행하지 않았다고 말하지 않습니다 . 그래서 매번 이렇게해야합니다.

instance (Num a, Num b) => StupidClass (FancyComplex a b) where
    add (FancyComplex (a, b)) (FancyComplex (a', b')) = FancyComplex (a+a', b+b')

newtype 정의에 제약 조건을 작성하는 것은 매번 명시 적으로 제약 조건을 작성하도록 강제하는 것입니다. 그래도 잊어 버린 경우에도 유용합니다. 그러나 물론 매번 제약 조건을 다시 작성할 필요는 없습니다.

newtype 정의에서 제약 조건을 자동으로 암시 적으로 상속하려면 어떻게해야합니까? 이것이 가능한가? 그렇지 않다면 그 이유가 있습니까?

현재 내 약한 해결 방법은 유형 별칭을 정의하는 것입니다. type FancyComplexReqs a b = (Num a, Num b)

감사

지출

최소한의 의미를 변경하지 않고는 구현할 수 없습니다 newtype.

newtype (Num a, Num b) => FancyComplex a b = FancyComplex (a, b)

instance StupidClass (FancyComplex a b) where
    add (FancyComplex (a, b)) (FancyComplex (a', b')) = FancyComplex (a+a', b+b')

마지막 줄에서는의 메서드 인 a+a'함수 가 필요하므로 폐기 할 필요가 있습니다. 다음 옵션 만 볼 수 있습니다.+Num

  1. +함수는 내부에 저장되는 FancyComplex값. 그것은 작동하지만 Haskell Report는 이것이 newtype동일한 쌍의 메모리 내 표현을 갖도록 요구합니다 . 추가 포인터를위한 공간이 없습니다.

  2. Num a, Num b제약은 암시 적으로 우리가 구현에 필요하기 때문에 인스턴스 정의에 추가됩니다. 이것은 작동 할 수 있지만 그것에 대해 명시하는 것이 더 낫지 않을까요? 암시 적 제약 조건이 있으면 제약 조건이없는 것처럼 보이기 때문에 인스턴스를 읽기가 더 어려워집니다.

이제 가능한 대안이 있습니다. 옵션 1을 원하고 다른 런타임 메모리 내 표현으로 괜찮다면 data대신 다음을 사용하세요 .

data FancyComplex a b where
   FancyComplex :: (Num a, Num b) => a -> b -> FancyComplex a b

이런 식으로 각 값은 Num인스턴스에 대한 자체 포인터를 저장 합니다. 더 많은 메모리가 필요하지만 응용 프로그램에서는 문제가되지 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관