좋아, 나는 머리를 감싸기 위해 노력하고있어 기하학적 벡터 연산을위한 typeclass를 정의하려고한다. 나는 그것이 구성 요소 - 현명한 +,-,*,/;
을 위해 일할 수 있었다. 그러나 나는 내적 제품으로 고투하고있다.하스켈 벡터 Typeclass : [a] -> [a] -> a
class GeomVector a where
(>+) :: a -> a -> a
(>-) :: a -> a -> a
(>*) :: a -> a -> a
(>/) :: a -> a -> a
(>.) :: a -> a -> Double
data Vector a = Vec [a]
deriving Show
instance (Fractional a) => GeomVector (Vector a) where
(>+) (Vec u) (Vec v) = Vec $ zipWith (+) u v
(>-) (Vec u) (Vec v) = Vec $ zipWith (-) u v
(>*) (Vec u) (Vec v) = Vec $ zipWith (*) u v
(>/) (Vec u) (Vec v) = Vec $ zipWith (/) u v
(>.) (Vec u) (Vec v) = sum $ u >* v
분명히 결과가 유형 Fractional a
하지 Double
의 때문에 (>.) 작동하지 않습니다 내 인스턴스 정의.
하지만 클래스의 선언에서이 동작을 얻는 방법을 모르겠습니다.
class GeomVector [a] where
(>.) :: [a] -> [a] -> a
그러나 [a]
이 형이 아닌 형태 변수이기 때문에이 유효하지 않습니다 : 내가 할 같은 을했던 것과
이다.
나는 이것을 조금 더 잘 설명 할 수 있었으면 좋겠지 만 솔직히 그렇게 할만큼 이해하지는 못한다. 잘하면이 코드는 내가 고심하고있는 것을 좀 더 분명하게 해줄 것이다.
class GeomVector v where
(>+) :: Num a=> v a -> v a -> v a
(>-) :: Num a=> v a -> v a -> v a
(>*) :: Num a=> v a -> v a -> v a
(>/) :: Fractional a=> v a -> v a -> v a
(>.) :: Num a=> v a -> v a -> a
data Vector a = Vec { vecList :: [a] }
deriving Show
instance GeomVector Vector where
(>+) (Vec u) (Vec v) = Vec $ zipWith (+) u v
(>-) (Vec u) (Vec v) = Vec $ zipWith (-) u v
(>*) (Vec u) (Vec v) = Vec $ zipWith (*) u v
(>/) (Vec u) (Vec v) = Vec $ zipWith (/) u v
(>.) u v = sum $ vecList (u >* v)
그래서 GeomVector
의 모든 인스턴스가 Monad
클래스와 같은 종류의 * -> *
이있을 것이다 :
스칼라 유형을 나타내는 다른 유형 변수, 즉'클래스 GeomVector a ... (>. :: a -> a -> s')가 필요하다고 생각합니다. – ErikR
원하는 유형의 [연관 유형 동의어] (http://www.haskell.org/haskellwiki/GHC/Type_families#An_associated_type_synonym_example) – Lambdageek
결과 유형이 (>.)이기 때문에 클래스 선언에 결함이 있습니다. 여러분은'''u''와'''v''의 내적을 생성하려고합니다. 여러분의 클래스 인스턴스가 아닌 리스트입니다. –