Haskell 다중 매개 변수 클래스 (템플릿 유형 클래스)

블라 우레 이머

스칼라와 벡터에 대한 일반 가우스 함수를 구현하고 싶습니다. Ada 또는 C ++에서는 단순히이를위한 템플릿을 선택하지만 Haskell에서는 약간 혼란 스럽습니다.

확률을 결합하거나 계산하는 것과 같이 가우스 연산자를 적용 할 수있는 클래스를 정의하는 것으로 시작합니다.

class Gaussian g where
  (!*) :: g -> g -> g
  prob :: g -> a -> Float -- Here, I want a to be depending on g

data Gaussian1D = Gaussian1D Float Float
data Gaussian2D = Gaussian2D (Linear.V2 Float) Linear.V2(LinearV2 Float)

, 그리고 다음과 같은 것을 갖고 싶습니다.

instance Gaussian Gaussian1D where
  prob :: Gaussian1D -> Float -> Float

instance Gaussian Gaussian2D where
  prob :: Gaussian2D -> Linear.V2 Float -> Float

그러나 나는 이것을 좋은 방식으로 구현할 수 없습니다. 템플릿-하스켈 분야를 파헤 치지 않고 다중 매개 변수 클래스를 사용하여 가능할까요? 예 :

class Gaussian g a where
  (!*) :: g a -> g a -> g a
  prob :: g a -> a -> Float

? 현재 나는 다음과 같은 domething을 할 때이 시나리오를 실현하지 못하고 있습니다.

data Gaussian1D = Gaussian1D Float Float

instance Gaussian Gaussian1D Float where

오류 포함 : Expected kind ‘* -> *’, but ‘Gaussian1D’ has kind ‘*’(btw,이 오류가 발생하는 이유를 이해할 수 없습니다.)

고마워

빌렘 반 온셈

g a예를 들어 다음과 같이 작성하면

(!*) :: g a -> g a -> g a

g유형 매개 변수를 사용 한다는 의미입니다 . 예를 들어 Gaussian1D다음과 같이 정의 되면 작동합니다 .

data Gaussian1D a = Gaussian1D a a

그러나 여기서는 그렇지 않습니다. 두 가지 유형 매개 변수를 사용하여 유형 클래스를 만들 수 있습니다.

{-# LANGUAGE AllowAmbiguousTypes, MultiParamTypeClasses #-}

class Guassian g a where
  (!*) :: g -> g -> g
  prob :: g -> a -> Float

하지만이 때문에 어떤을 위해 인스턴스를 만들 수 있다는 것을 의미 g, a조합. 따라서 이는에 a의존하지 않거나 g적어도 직접적으로 의존하지 않음 을 의미합니다 . 따라서 Gaussian Gaussian1D DoubleGaussian Gaussian1D Float.

그러나 유형 유형 에 따라 결정되는 기능적 종속성 [wiki] 을 사용할 수 있습니다 . 따라서 동일한 두 개의를 사용할 수 없습니다 .agag

{-# LANGUAGE AllowAmbiguousTypes, FunctionalDependencies, MultiParamTypeClasses #-}

class Guassian g a | g -> a where
  (!*) :: g -> g -> g
  prob :: g -> a -> Float

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

"템플릿 템플릿 매개 변수의 템플릿 인수는 클래스 템플릿 또는 유형 별칭 템플릿이어야합니다."

분류에서Dev

클래스 참조를 유형이 아닌 템플릿 매개 변수로 사용할 수 없습니다.

분류에서Dev

템플릿 매개 변수 만 다른 두 클래스

분류에서Dev

템플릿 클래스의 유형 이름으로 매개 변수 팩 사용

분류에서Dev

클래스 템플릿의 추가 비 유형 템플릿 매개 변수를 사용하여 가변 메서드의 중첩 된 호출

분류에서Dev

템플릿 클래스의 템플릿 유형에 대한 매개 변수를 추가 할 수 있습니까?

분류에서Dev

C ++ : 매개 변수 팩을 사용하여 가변 유형 매개 변수로 템플릿 클래스 상속

분류에서Dev

변수 템플릿 매개 변수로서의 C ++ 열거 형 클래스

분류에서Dev

템플릿 클래스 매개 변수로서의 템플릿 클래스

분류에서Dev

유형이 아닌 템플릿 매개 변수의 C ++ 클래스 유형 : 추론 가이드 실패

분류에서Dev

C ++에서 상위 클래스의 템플릿 매개 변수로 중첩 된 클래스

분류에서Dev

다른 매개 변수에 따라 중첩 된 템플릿 클래스 인스턴스를 기본 템플릿 매개 변수로 설정하는 방법

분류에서Dev

또 다른 클래스 템플릿 전문화 (부울 매개 변수)

분류에서Dev

자바 템플릿 템플릿 유형으로 함수 매개 변수 클래스 유형 인스턴스를 반환하는 방법

분류에서Dev

알 수없는 유형의 클래스 템플릿 매개 변수로 함수 전달

분류에서Dev

템플릿 매개 변수를 지정하지 않고 클래스 템플릿 범위의 열거 형 사용

분류에서Dev

클래스 내에서 중첩 된 템플릿 매개 변수의 중첩 된 유형을 참조하는 방법은 무엇입니까?

분류에서Dev

템플릿 매개 변수로 템플릿 클래스 인스턴스화

분류에서Dev

클래스 템플릿에서 상속되는 템플릿 매개 변수의 기본 템플릿 유형을 확인하는 방법은 무엇입니까?

분류에서Dev

다른 유형 매개 변수로 std :: set을 처리 할 수있는 템플릿 클래스를 만드는 방법

분류에서Dev

다른 클래스의 템플릿 매개 변수로 템플릿 클래스를 인스턴스화합니다.

분류에서Dev

클래스 유형이 아닌 템플릿 매개 변수 초기화가 컴파일되지 않음

분류에서Dev

유형이 아닌 매개 변수의 존재를 기반으로 클래스 템플릿 오버로드?

분류에서Dev

클래스 유형을 반환하려고하지만 템플릿 매개 변수에 오류가 있습니다.

분류에서Dev

기본 클래스가 멤버 함수의 매개 변수 유형 인 경우 기본 클래스의 템플릿 인수를 지정해야합니까?

분류에서Dev

두 개의 기본 클래스가있는 경우에만 템플릿 매개 변수에서 클래스 유형을 허용하는 방법

분류에서Dev

오류 : 매개 변수 팩 클래스 템플릿의 클래스 템플릿에 대한 인수가 너무 많습니다.

분류에서Dev

C ++ 클래스가 템플릿 기본 클래스에서 파생되었는지 확인합니다. 필수 템플릿 매개 변수가있는

분류에서Dev

템플릿 매개 변수에서 파생 된 클래스

Related 관련 기사

  1. 1

    "템플릿 템플릿 매개 변수의 템플릿 인수는 클래스 템플릿 또는 유형 별칭 템플릿이어야합니다."

  2. 2

    클래스 참조를 유형이 아닌 템플릿 매개 변수로 사용할 수 없습니다.

  3. 3

    템플릿 매개 변수 만 다른 두 클래스

  4. 4

    템플릿 클래스의 유형 이름으로 매개 변수 팩 사용

  5. 5

    클래스 템플릿의 추가 비 유형 템플릿 매개 변수를 사용하여 가변 메서드의 중첩 된 호출

  6. 6

    템플릿 클래스의 템플릿 유형에 대한 매개 변수를 추가 할 수 있습니까?

  7. 7

    C ++ : 매개 변수 팩을 사용하여 가변 유형 매개 변수로 템플릿 클래스 상속

  8. 8

    변수 템플릿 매개 변수로서의 C ++ 열거 형 클래스

  9. 9

    템플릿 클래스 매개 변수로서의 템플릿 클래스

  10. 10

    유형이 아닌 템플릿 매개 변수의 C ++ 클래스 유형 : 추론 가이드 실패

  11. 11

    C ++에서 상위 클래스의 템플릿 매개 변수로 중첩 된 클래스

  12. 12

    다른 매개 변수에 따라 중첩 된 템플릿 클래스 인스턴스를 기본 템플릿 매개 변수로 설정하는 방법

  13. 13

    또 다른 클래스 템플릿 전문화 (부울 매개 변수)

  14. 14

    자바 템플릿 템플릿 유형으로 함수 매개 변수 클래스 유형 인스턴스를 반환하는 방법

  15. 15

    알 수없는 유형의 클래스 템플릿 매개 변수로 함수 전달

  16. 16

    템플릿 매개 변수를 지정하지 않고 클래스 템플릿 범위의 열거 형 사용

  17. 17

    클래스 내에서 중첩 된 템플릿 매개 변수의 중첩 된 유형을 참조하는 방법은 무엇입니까?

  18. 18

    템플릿 매개 변수로 템플릿 클래스 인스턴스화

  19. 19

    클래스 템플릿에서 상속되는 템플릿 매개 변수의 기본 템플릿 유형을 확인하는 방법은 무엇입니까?

  20. 20

    다른 유형 매개 변수로 std :: set을 처리 할 수있는 템플릿 클래스를 만드는 방법

  21. 21

    다른 클래스의 템플릿 매개 변수로 템플릿 클래스를 인스턴스화합니다.

  22. 22

    클래스 유형이 아닌 템플릿 매개 변수 초기화가 컴파일되지 않음

  23. 23

    유형이 아닌 매개 변수의 존재를 기반으로 클래스 템플릿 오버로드?

  24. 24

    클래스 유형을 반환하려고하지만 템플릿 매개 변수에 오류가 있습니다.

  25. 25

    기본 클래스가 멤버 함수의 매개 변수 유형 인 경우 기본 클래스의 템플릿 인수를 지정해야합니까?

  26. 26

    두 개의 기본 클래스가있는 경우에만 템플릿 매개 변수에서 클래스 유형을 허용하는 방법

  27. 27

    오류 : 매개 변수 팩 클래스 템플릿의 클래스 템플릿에 대한 인수가 너무 많습니다.

  28. 28

    C ++ 클래스가 템플릿 기본 클래스에서 파생되었는지 확인합니다. 필수 템플릿 매개 변수가있는

  29. 29

    템플릿 매개 변수에서 파생 된 클래스

뜨겁다태그

보관