man*_*old 2 haskell functional-programming typeclass
我正在阅读关于Haskell wiki 的类别类别.当我遇到作为仿((,) e)函数实例的类型类时,我很困惑.据作者说
((,) e)表示一个容器,它包含e类型的"注释"及其保存的实际值.
但是,我不太明白这句话的意思,因为我在这里只能看到一个分段的元组.我还在Hoogle上搜索了这个类型类,但一无所获.
((,) 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将修改值,但不保留键.