type families:如何为一对数据类型系列实例化Bifunctor?

时间:2016-04-15 08:19:18

标签: haskell type-families

我尝试了解数据类型系列如何用于隐藏构造函数。给出的简单示例是一对具有转换和普通对等的操作的方法。 bifunctor的一个实例不能编译;错误信息是

  

src/TypeFamilyTest.hs:66:21:       Bifunctor的第一个参数应该有* -> * -> *种,         但是Pairs a bghc-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)

1 个答案:

答案 0 :(得分:2)

类型错误告诉你一切。 Pair不是数据类型的名称。它是一个类的名称。 Pair a b :: Constraint Pair :: * -> * -> Constraint Bifunctor* -> * -> *只能通过类型newtype Pair a b = Vec2 { splitPair :: (a, b) } fstP :: Pair a b -> a fstP = fst . splitPair sndP :: Pair a b -> b sndP = snd . splitPair instance Bifunctor Pair where bimap f g (Vec2 (x, y)) = Vec2 (f x, g y) 的数据类型进行实例化。

我猜你可能有这样的意思:

Vec2

我不明白为什么你最初将 $ie = New-Object -comobject InternetExplorer.Application $ie.visible = $true $ie.Navigate($URL) while( $ie.busy){Start-Sleep 1} 作为关联类型。我怀疑这可能是XY problem - 你真正想要实现的目标是什么?