【发布时间】:2013-11-15 11:53:38
【问题描述】:
我想知道 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)
问题:
可以从
map是Functor实例data List a = Nil | Cons a (List a)的假设出发推导出map的定义吗?如果是这样,必须做出哪些假设才能做到这一点?是否有任何 Haskell 数据类型具有多个满足函子定律的
Functor实例?ghc何时可以派生functor实例,何时不能派生?这一切都取决于我们如何定义平等吗?
Functor法则以值相等的形式表达,但我们不要求Functors具有Eq实例。那么这里有什么选择吗?
关于相等,当然有我称之为“构造函数相等”的概念,它允许我们推断[a,a,a] 对于任何类型的a 的任何值都与[a,a,a]“相等”,即使@987654339 @ 没有为它定义 (==)。所有其他(有用的)平等概念可能比这种等价关系更粗糙。但我怀疑Functor 法律中的平等更像是一种“推理平等”关系,并且可以是特定于应用程序的。对此有什么想法吗?
【问题讨论】:
-
Either a b可以通过两种方式成为函子。(a, b)也可以...这些都是微不足道的例子,但我认为不会有一些非微不足道的例子。 -
@poorsod 不,它不能,使用类型柯里化实现它的唯一方法是将
f应用于Right的值,否则noop -
@jozefg 你是对的 - 我想这是 Haskell 类型类
Functor和 数学事物 'functor 之间的摩擦点'。