我正在阅读Haskell Wiki上的typeclassopedia。当我遇到类型类((,) e)
(它是函子的一个实例)时,我感到非常困惑。根据作者
((,) e)
代表一个容器,其中包含类型e的“注释”及其所保存的实际值。
但是,由于我在这里只能看到一个分段的元组,所以我不太理解这句话的含义。我也在Hoogle上搜索了该类型类,但一无所获。
答案 0 :(得分:7)
((,) e)
不是类型类;这只是一种类型。实际上,它是一个分段元组。这里的想法是,您可以将(e, a)
视为具有类型a
的值和具有e
类型的“注释”的“容器”。 fmap
的{{1}}修改值,但不修改注释。在“将功能用作容器”的类比中,注释是容器的一部分,而不是其 contents 的一部分。
让我们考虑一种树:
((,) e)
这些看起来像什么? data Tree f a
= Leaf
| Node (Tree f a) (f a) (Tree f a)
instance Functor f => Functor (Tree f) where
fmap _ Leaf = Leaf
fmap f (Node l fa r) = Node (fmap f l) (fmap f fa) (fmap f r)
是类型为Tree Identity a
的元素的普通二进制树。它可以表示例如一组值。另一方面,a
是 pairs 对的二叉树。它可以表示从类型Tree ((,) k) a
的键到类型k
的值的映射。使用a
在树上进行映射将修改值,但不保留键。