什么`((,)e`在Haskell中意味着什么?

man*_*old 2 haskell functional-programming typeclass

我正在阅读关于Haskell wiki 的类别类别.当我遇到作为仿((,) e)函数实例的类型类时,我很困惑.据作者说

((,) e) 表示一个容器,它包含e类型的"注释"及其保存的实际值.

但是,我不太明白这句话的意思,因为我在这里只能看到一个分段的元组.我还在Hoogle上搜索了这个类型类,但一无所获.

dfe*_*uer 7

((,) e)不是类型类; 它只是一种类型.事实上,它一个分段元组.这里的想法是你可以把它(e, a)看作一个"容器",它包含一个类型的值a和一个类型的"注释" e.在fmap((,) e)修改的值,而不是注解.在"functor as container"类比中,注释是容器的一部分,而不是其内容的一部分.

让我们考虑一种树:

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)
Run Code Online (Sandbox Code Playgroud)

这些是什么样的?Tree Identity a是一个类型元素的纯二进制树a.它可以表示例如一组值.Tree ((,) k) a另一方面,是一二叉树.它可以表示从类型的键到类型k值的映射a.使用树进行映射fmap将修改值,但不保留键.