我在想,在Haskell中,Functor
实例在多大程度上是由函子法则唯一确定的。
由于ghc
可以为至少“常规”数据类型派生Functor
实例,因此它们在很多情况下至少是唯一的。
为了方便起见,Functor
定义和函子法则如下:
class Functor f where
fmap :: (a -> b) -> f a -> f b
fmap id = id
fmap (g . h) = (fmap g) . (fmap h)
问题:
是否可以从假设
data List a = Nil | Cons a (List a)
是Functor
实例出发推导出map
的定义?如果是,为了实现这一点需要做出哪些假设?是否有任何 Haskell 数据类型拥有多个满足函子定律的
Functor
实例?在什么情况下
ghc
能够派生出一个functor
实例,而在什么情况下则不能?所有这些都取决于我们如何定义相等性吗?
Functor
定律是以值相等性来表达的,然而我们并不要求Functors
拥有Eq
实例。那么这里有一些选择吗?
关于相等性,显然存在一种我称之为“构造函数相等性”的概念,它允许我们推理出对于任何类型为 a
的值,[a,a,a]
都与另一个值为 [a,a,a]
相等,即使类型 a
没有定义 (==)
。所有其他有用的相等性概念可能都比这种等价关系粗略。但我怀疑 Functor
定律中的相等性更像是“推理相等性”关系,可以是应用程序特定的。对此有何想法?
(a, b)
也可以。这些都是微不足道的例子,但我认为可能会有一些非微不足道的例子。 - Benjamin Hodgsonf
应用于Right
值,否则不做任何操作。 - daniel gratzerFunctor
和_数学概念_ 'functor'之间冲突的一个焦点。 - Benjamin Hodgson