Functor实例是唯一的吗?

Eri*_*ikR 19 haskell functor ghc

我想知道FunctorHaskell中的实例在多大程度上由函子定律(唯一)确定.

由于ghc可以Functor为至少"普通"数据类型派生实例,因此它们似乎必须至少在各种情况下都是唯一的.

为方便起见,Functor定义和函子定律是:

class Functor f where
  fmap :: (a -> b) -> f a -> f b

fmap id = id
fmap (g . h) = (fmap g) . (fmap h)
Run Code Online (Sandbox Code Playgroud)

问题:

  • 可以map从假设它是一个Functor实例开始得出定义data List a = Nil | Cons a (List a)吗?如果是这样,为了做到这一点,必须做出哪些假设?

  • 是否有任何Haskell数据类型具有多个Functor满足函子定律的实例?

  • 什么时候可以ghc派生出一个functor实例而什么时候不能呢?

  • 所有这些都取决于我们如何定义平等吗?该Functor法律在价值的平等的条件下表达,但我们不要求FunctorsEq实例.那么这里有一些选择吗?

关于相等性,肯定存在一种我称之为"构造函数相等"的概念,它允许我们推断任何类型的任何值[a,a,a]都"等于",即使它没有为它定义.所有其他(有用的)平等概念可能比这种等价关系更粗糙.但我怀疑法律中的平等更多是"推理平等"关系,并且可以是特定于应用的.有什么想法吗?[a,a,a]aa(==)Functor

Mat*_*ick 21

见Brent Yorgey的Typeclassopedia:

与我们将遇到的其他类型类不同,给定类型最多只有一个Functor的有效实例.这可以通过fmap类型的自由定理来证明.事实上,GHC可以自动为许多数据类型派生 Functor实例.