智能构造函数类型可以具有多个有效的Functor实例吗?

问题描述 投票:3回答:1

关于Functor的这两个规则是众所周知的:

  1. 如果类型参数相反出现,则无法创建Functor
  2. 任何类型最多具有一个有效的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实例?

haskell constructor typeclass functor parametric-polymorphism
1个回答
1
投票

绝对。假设您有

© www.soinside.com 2019 - 2024. All rights reserved.