gpt4 book ai didi

haskell - 树仿函数和可折叠但带有节点。对此有什么概括吗?

转载 作者:行者123 更新时间:2023-12-02 08:28:51 24 4
gpt4 key购买 nike

data Tree t = Empty | Node t (Tree t) (Tree t)

我们可以创建 Functor 实例并使用

fmap :: (t -> a) -> Tree t -> Tree a

但是如果我想要(Tree t -> a)而不是(t -> a),这样我就可以访问整个(节点t)而不仅仅是t

treeMap :: (Tree t -> a) -> Tree t -> Tree a
treeMap f Empty = Empty
treeMap f n@(Node _ l r) = Node (f n) (treeMap f l) (treeMap f r)

与折叠相同

treeFold :: (Tree t -> a -> a) -> a -> Tree t -> a

像这样的函数有什么概括吗?

map :: (f t -> a) -> f t -> f a
fold :: (f t -> a -> a) -> a -> f t -> a

最佳答案

您刚刚发现了共生体!嗯,差不多了。

class Functor f => Comonad f where
extract :: f a -> a
duplicate :: f a -> f (f a)

instance Comonad Tree where
extract (Node x _ _) = x -- this one only works if your trees are guaranteed non-empty
duplicate t@(Node n b1 b2) = Node t (duplicate b1) (duplicate b2)

使用duplicate,您可以实现您的功能:

treeMap f = fmap f . duplicate
freeFold f i = foldr f i . duplicate

要正确执行此操作,您应该通过类型系统强制执行非空性:

type Tree' a = Maybe (Tree'' a)

data Tree'' t = Node' t (Tree' t) (Tree' t)
deriving (Functor)

instance Comonad Tree'' where
extract (Node' x _ _) = x
duplicate t@(Node' _ b1 b2) = Node' t (fmap duplicate b1) (fmap duplicate b2)

关于haskell - 树仿函数和可折叠但带有节点。对此有什么概括吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32295400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com