Ich versuche zu verstehen, wie Datentypfamilien verwendet werden können, um einen Konstruktor zu verstecken. Das triviale Beispiel ist ein Paar mit Operationen zum Konvertieren von und zu gewöhnlichen Paaren usw.). Eine Instanz für bifunctor wird nicht kompiliert. die FehlermeldungTyp Familien: wie Bifunctor für eine Paardatentypfamilie instanziieren?
src/TypeFamilyTest.hs:66:21
: Das erste Argument vonBifunctor
sollte Art* -> * -> *
haben, aberPairs a b
hat Artghc-prim-0.4.0.0:GHC.Prim.Constraint
In der Instanzdeklaration für
Bifunctor (Pairs a b)
Bifunctor Pair where ...
Der Versuch, ich eine andere Fehlermeldung, die das gleiche auflistet GHC.Prim.Constraint
. Was sind die richtigen Argumente für die Instanz und wie wird der Kontext übergeben?
class Pairs a b where
data Vec2 a b
mkPair :: (a,b) -> Vec2 a b -- (FirstF a, SecondF a) -> a
splitPair :: Vec2 a b -> (a,b)
fstP :: Vec2 a b -> a
sndP :: Vec2 a b -> b
fstP = fst . splitPair
sndP = snd . splitPair
instance () => Bifunctor (Pairs a b) where
bimap opv oph vh = mkPair (opv . fstP $ vh, oph . sndP $ vh)
In Datenfamilien geht es nicht darum, Konstruktoren zu verbergen. Ihre Konstruktoren können auf die gleiche Weise wie normale Datentypen ein- oder ausgeblendet werden. Datenfamilien sind nicht-parametrische Datentypen - Typen, die ihre Typargumente überprüfen, bevor sie entscheiden, wie ihre Konstruktoren aussehen. –
Eine Typklasse ist keine Klasse im objektorientierten Sinne. Es kapselt Daten und die Operation, die daran arbeiten, nicht ein. – chepner
Der nächste OOP-Begriff einer Haskell-'Klasse' ist eine Java-ähnliche' Schnittstelle', und selbst diese Korrespondenz ist lose. – chi