まあ、私は型の周りを頭で囲んでいるので、幾何ベクトル操作のための型クラスを定義しようとしています。私はそれをコンポーネントワイズ+,-,*,/;
のために働かせることができましたが、私はドットプロダクトに苦労しています。結果はタイプFractional a
、ないDouble
であるためHaskell Vector 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
明らかに(>。)のための私のインスタンス定義は機能しません。
しかし、この動作をクラスの宣言から取得する方法はわかりません。
class GeomVector [a] where
(>.) :: [a] -> [a] -> a
しかし[a]
がタイプとないタイプの変数であるため、これは無効です:私がやりようをいただきたい何
です。
私はこのことについて少し説明したいと思っていますが、私は正直なところ理解できません。うまくいけば、コードは、私が苦労していることをもう少し明白にするでしょう。
スカラーの型を表す別の型変数、つまり 'class GeomVector a ... where(...。):: a - > a - > s'が必要だと思います。 – ErikR
あなたが望むものは[関連タイプの同義語]です(http://www.haskell.org/haskellwiki/GHC/Type_families#An_associated_type_synonym_example) – Lambdageek
結果の型が(>。)であるだけでなく、クラス宣言にも瑕疵があります。 '' 'u''と' 'v''の内積を生成しようとしていますが、これはあなたのクラスのインスタンスではなく のリストです。 –