[英]How is this Functor instance implemented?
data GenTree f a -- kind (* -> *) -> * -> *
= Node (f (GenTree f a))
| Leaf a
instance Functor f => Functor (GenTree f) where
fmap f (Node ts) = Node (fmap (fmap f) ts)
fmap f (Leaf x) = Leaf (f x)
我不理解上述Functor实例中的fmap (fmap f) ts
语句。 有人可以解释为什么这样写吗?
如果您查看Node
的结构,它包含一个f (GenTree fa)
,那么如果我们查看所讨论的表达式的类型:
fmap f (Node ts) = Node (fmap (fmap f) ts)
f
在这里是a- a -> b
类型
ts
的类型为f (GenTree fa)
,但是我们应该知道,此表达式中的f
不是上面的函数,而是实际上的类型构造函数。 为了消除混乱,我们将上述函数重命名为g
,如下所示:
fmap g (Node ts) = Node (fmap (fmap g) ts)
现在为了应用我们的功能g
,我们需要得到的实际值的保持a
。 我们知道我们的f
类型构造函数具有Functor
实例,因此如果在其上进行映射,则会得到GenTree fa
:
fmap (\tree -> ...) ts
现在我们有了GenTree
我们可以递归地对其调用fmap
,以便在某个时候到达Leaves并实际将函数应用于值,如果我们在所有样板中都写出了它,这个:
fmap g (Node ts) = Node (fmap (\tree -> fmap g tree) ts)
因此,在本质上写着这样,因为我们需要fmap
在两个f
类型构造和实际GenTree
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.