繁体   English   中英

该Functor实例如何实现?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM