2 Stimmen

Fehler bei der Artübereinstimmung, wenn versucht wird, die existenzielle Quantifizierung zu verwenden

Möchte erklären, dass

data (Coord a) => Triangle a = Triangle{t0 :: a, t1 :: a, t2 :: a}

Ich erhalte jedoch

Geometry.hs:15:19:Art-Fehlanpassung Erwartete Art * -> *', but p' hat Art *' In the class declaration for Koord'

wobei Coord definiert ist als

class (Traversable p, Functor p, Foldable p, Applicative p) => Coord p where

getComponents :: Num a => p a -> [a]
getComponents = toList

fromComponents :: Num a => [a] -> p a

magSq :: Num a => p a -> a
magSq = Prelude.sum . map (\x -> x * x) . getComponents

dotProduct :: Num a => p a -> p a -> a
dotProduct a b = Prelude.sum $ zipWith (*) (getComponents a) (getComponents b)

Irgendwelche Ideen?

PS. Der Code ist eine leicht modifizierte Version dessen, was im Data.SG-Paket zu finden ist

4voto

Jason Orendorff Punkte 39655

Das könnte für Sie funktionieren:

data (Coord p, Num a) => Triangle p a = Triangle {t0 :: p a, t1 :: p a, t2 :: p a}

Kurz gesagt, ein Typ, der die Typklasse Coord ist ein parametrisierter Typ. Sie müssen den Parameter angeben.

(Die freundlich eines Typs gibt an, ob er Parameter hat. Typen der Art * können tatsächliche Werte haben. Alle anderen Typen sind parametrisiert. Jeder Typ, der die Typklasse Coord ist von Art * -> * , was bedeutet, dass es ein Argument der Art * .)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X