Haskell中的((,)e`是什么意思?

时间:2019-01-03 03:41:51

标签: haskell functional-programming typeclass

我正在阅读Haskell Wiki上的typeclassopedia。当我遇到类型类((,) e)(它是函子的一个实例)时,我感到非常困惑。根据作者

  

((,) e)代表一个容器,其中包含类型e的“注释”及其所保存的实际值。

但是,由于我在这里只能看到一个分段的元组,所以我不太理解这句话的含义。我也在Hoogle上搜索了该类型类,但一无所获。

1 个答案:

答案 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在树上进行映射将修改值,但不保留键。