我想知道在Haskell中Functor
实例在多大程度上由函子法确定(唯一)。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)
问题:
就可以得出从假设开始的
map
定义,它是一个Functor
实例data List a = Nil | Cons a (List a)
?如果是这样,为了做到这一点,必须做出什么假设?是否有任何Haskell数据类型有一个以上的
Functor
实例满足函子法则?什么时候可以
ghc
派生出一个functor
的例子,什么时候不能呢?这一切都取决于我们如何定义平等吗?
Functor
法则用值的等式表示,但我们并不要求Functors
具有Eq
实例。那么这里有一些选择吗?
关于平等,肯定是我所谓的“构造平等”这让我们有理由相信,[a,a,a]
是“平等”到[a,a,a]
为任何类型的a
任何值,即使a
没有一个概念为其定义的(==)
。所有其他(有用的)平等概念可能比这个等价关系更粗糙。但我怀疑Functor
法律中的平等更多是“推理平等”关系,并且可以是特定于应用程序的。对此有何想法?
“或者b'可以通过两种方式成为仿函数。那么'(a,b)'......这些都是微不足道的例子,但我认为不会有一些不重要的例子。 –
@poorsod不,它不能,用类型currying实现它的唯一方法是将'f'应用于'Right'的值,否则noop – jozefg
@jozefg你是对的 - 我想这是一个摩擦点_Haskell typeclass_'Functor'和_mathematical thing_'functor'。 –