我有一些人为的类型:
{-# LANGUAGE DeriveFunctor #-}
data T a = T a deriving (Functor)
...并且该类型是一些人为类的实例:
class C t where
toInt :: t -> Int
instance C (T a) where
toInt _ = 0
我如何表达一个函数约束,它T a
是某个类的实例a
?
例如,考虑以下函数:
f t = toInt $ fmap Left t
直观地说,我希望上述函数能够正常工作,因为toInt
它适用于T a
all a
,但我无法在类型中表达这一点。这不起作用:
f :: (Functor t, C (t a)) => t a -> Int
...因为当我们应用时fmap
,类型已变为Either a b
. 我无法使用以下方法解决此问题:
f :: (Functor t, C (t (Either a b))) => t a -> Int
...因为b
不代表一个普遍量化的变量。我也不能说:
f :: (Functor t, C (t x)) => t a -> Int
...或用于forall x
暗示约束对所有人都有效x
。
所以我的问题是,是否有办法说约束在其某些类型变量上是多态的。