我尝试了解数据类型系列如何用于隐藏构造函数。给出的简单示例是一对具有转换和普通对等的操作的方法。 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)
答案 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 - 你真正想要实现的目标是什么?