Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔:返回一棵多向树的所有叶子?_Haskell_Tree_Traversal - Fatal编程技术网

Haskell 哈斯克尔:返回一棵多向树的所有叶子?

Haskell 哈斯克尔:返回一棵多向树的所有叶子?,haskell,tree,traversal,Haskell,Tree,Traversal,返回二叉树的所有叶子非常简单: data BinTree a = Empty | Node (BinTree a) a (BinTree a) deriving (Eq, Show) getLeaves :: BinTree a -> [a] getLeaves Empty = [] getLeaves (Node left current right) = [current]++getLeaves left++getLeaves right 但是,如果树不是二叉树而是多路树(即树中的

返回二叉树的所有叶子非常简单:

data BinTree a = Empty | Node (BinTree a) a (BinTree a) deriving (Eq, Show)

getLeaves :: BinTree a -> [a]
getLeaves Empty = []
getLeaves (Node left current right) = [current]++getLeaves left++getLeaves right
但是,如果树不是二叉树而是多路树(即树中的每个节点都可以有任意数量的子节点和叶子),情况又如何呢


我不是在找人帮我发布解决方案;我只是不确定Haskell的一般概念是否值得学习,以解决为这种类型的树编写
getLeaves
的问题。

您可能有兴趣看到
getLeaves
在这两种情况下都可以以
可折叠的
可遍历的
模式实现
Foldable
具有
toList::Foldable f=>fa->[a]
,它编码了在
Foldable
容器
f
中收集所有值的思想
Traversable
具有更强大的
Traversable::(应用程序f,Traversable t)=>(a->t b)->(f a->t(f b))
编码了在
Traversable
容器
t
上进行某种遍历的思想<代码>可遍历
表示可折叠

newtype K b a = K { unK :: b } deriving Functor

instance Monoid b => Applicative (K b) where
  pure = K mempty
  K e <*> K f = K (e <> f)

foldMapDefault :: (Traversable t, Monoid m) => (a -> m) -> (t a -> m)
foldMapDefault f = unK . traverse (K . f)
newtype kba=K{unK::b}派生函子
实例幺半群b=>Applicative(kb),其中
纯=K记忆
kef=K(ef)
foldMapDefault::(可遍历t,幺半群m)=>(a->m)->(TA->m)
foldmapf默认值=unK。导线测量(K.f)

您可能会感兴趣地看到,这两种情况下的
getLeaves
都可以以
Foldable
Traversable
的模式实现
Foldable
具有
toList::Foldable f=>fa->[a]
,它编码了在
Foldable
容器
f
中收集所有值的思想
Traversable
具有更强大的
Traversable::(应用程序f,Traversable t)=>(a->t b)->(f a->t(f b))
编码了在
Traversable
容器
t
上进行某种遍历的思想<代码>可遍历
表示可折叠

newtype K b a = K { unK :: b } deriving Functor

instance Monoid b => Applicative (K b) where
  pure = K mempty
  K e <*> K f = K (e <> f)

foldMapDefault :: (Traversable t, Monoid m) => (a -> m) -> (t a -> m)
foldMapDefault f = unK . traverse (K . f)
newtype kba=K{unK::b}派生函子
实例幺半群b=>Applicative(kb),其中
纯=K记忆
kef=K(ef)
foldMapDefault::(可遍历t,幺半群m)=>(a->m)->(TA->m)
foldmapf默认值=unK。导线测量(K.f)

我认为您的代码中有一个错误,您正在将树的所有节点添加到叶子列表中,这是错误的,您需要检查某个节点是否为叶子,然后才能将其添加到列表中

data BinTree a = Empty | Node (BinTree a) a (BinTree a) deriving (Eq, Show)

getLeaves :: BinTree a -> [a]
getLeaves Empty = []
getLeaves (Node Empty current Empty) = [current] 
getLeaves (Node left current right) = getLeaves left++getLeaves right
对于非二叉树也是如此(我认为代码中也有一个错误)


我认为您的代码中有一个错误,您正在将树的所有节点添加到叶子列表中,这是错误的,您需要检查某个节点是否是叶子,然后才能将其添加到列表中

data BinTree a = Empty | Node (BinTree a) a (BinTree a) deriving (Eq, Show)

getLeaves :: BinTree a -> [a]
getLeaves Empty = []
getLeaves (Node Empty current Empty) = [current] 
getLeaves (Node left current right) = getLeaves left++getLeaves right
对于非二叉树也是如此(我认为代码中也有一个错误)