关于Functor
的这两个规则是众所周知的:
Functor
Functor
实例但是,如果您稍微作弊,则可以违反第一条规则。以休斯列表为例:
data HList a = UnsafeHList ([a] -> [a])
pattern HList a <- UnsafeHList (($ []) -> a)
where HList a = UnsafeHList (a ++)
instance Functor HList where
fmap f (HList a) = HList (map f a)
-- instances necessary to make HList useful, but irrelevant to this example, have been omitted
只要您假设所有HList
都将通过智能构造函数生成,则Functor
实例是合法的,即使a
出现相反。
我的问题:您可以使用类似的技术来打破第二条规则吗?如果您假设它们将始终通过智能构造函数生成,那么是否有任何类型具有两个不同的有效Functor
实例?
绝对。假设您有