스칼라와 벡터에 대한 일반 가우스 함수를 구현하고 싶습니다. 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 Double
및 Gaussian Gaussian1D Float
.
그러나 유형 이 유형 에 따라 결정되는 기능적 종속성 [wiki] 을 사용할 수 있습니다 . 따라서 동일한 두 개의를 사용할 수 없습니다 .a
g
a
g
{-# LANGUAGE AllowAmbiguousTypes, FunctionalDependencies, MultiParamTypeClasses #-}
class Guassian g a | g -> a where
(!*) :: g -> g -> g
prob :: g -> a -> Float
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다