我尝试了解如何使用数据类型族来隐藏构造函数。给出的微不足道的例子是一对具有从普通对转换成普通对的操作等)。 bifunctor的实例不能编译;该错误信息是类型族:如何为一对数据类型族实例化Bifunctor?
src/TypeFamilyTest.hs:66:21
: 的Bifunctor
的第一个参数应该有一种* -> * -> *
, 但Pairs a b
有种ghc-prim-0.4.0.0:GHC.Prim.Constraint
在实例声明
Bifunctor (Pairs a b)
试图Bifunctor Pair where ...
我再弄错误消息列表相同GHC.Prim.Constraint
。该实例的正确参数是什么?上下文将如何传递?
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)
数据家族并不是隐藏构造函数。它们的构造函数可以以普通数据类型的相同方式显示或隐藏。数据族关于非参数数据类型 - 在决定其构造函数的外观之前检查其类型参数的类型。 –
类型类不是面向对象意义上的类。它不封装数据和操作它的操作。 – chepner
Haskell'class'最接近OOP的概念是类似Java的'interface',即使这种对应也是松散的。 – chi