【发布时间】:2018-06-01 12:47:33
【问题描述】:
在 Haskell 中,(,) 的 Functor 实例显然是
instance Functor (,) where
fmap f (a,b) = (a,f b)
这导致了一个不直观的事实:
> fmap (const 5) [1, 2]
[5,5]
> fmap (const 5) (1, 2)
(1,5)
现在,在我看来,使用这个定义会更好:
instance Functor (,) where
fmap f (a,b) = (f a,f b)
它会像这样工作:
> fmap (const 5) (1, 2)
(5,5)
为什么不是这样?
【问题讨论】:
-
你如何定义
fmap succ ("Hello!", 42)? -
因为
class Functor (a :: * -> *) where ...所以它需要一个类型参数,并且类型参数的顺序是data (,) a b = (a, b)。 -
您是否尝试过编写
data MyTuple a b = MyTuple a b(以便您可以提供一个新实例),将您提议的实例转换为MyTuple,并查看编译器的内容?你得到的错误序列应该很有启发性。 -
这只是因为函子是在单一类型上定义的,而元组包含多种类型。因此……只有其中一个可以生效。