【发布时间】:2019-03-05 05:52:42
【问题描述】:
我是 Haskell 的初学者。在这里,我试图理解一个计算树中最大分支度的 Haskell 函数。
这里是数据类型:
data Tree a = Node a [Tree a] deriving (Show)
leaf :: a -> Tree a
leaf a = Node a []
这里是实现:
maxBranching :: Tree a -> Int
maxBranching (Node _ ts) = let localBranching = length ts in
max localBranching (maxBranchingOfSubtrees ts)
where maxBranchingOfSubtrees :: [Tree a] -> Int
maxBranchingOfSubtrees [] = 0
maxBranchingOfSubtrees (x:xs) = max (maxBranching x) (maxBranchingOfSubtrees xs)
这里是示例输入:
Node 2 [leaf 7, Node 3 [leaf 0], Node 1 [leaf 3, leaf 2]]
我不明白这个表达:
maxBranchingOfSubtrees (x:xs) = max (maxBranching x) (maxBranchingOfSubtrees xs)
max 如何将第一个元素与列表的其余部分进行比较,每次迭代后它在哪里更新最大值?如果我看到作为Leaf 7 的列表的第一个元素何时将作为maxBranching x 传递,则没有这种情况,它如何返回列表的第一个元素的长度,然后maxBranchingOfSubtress 如何处理列表的其余部分?然而,起初localBranching 包含列表length = 4?任何形式的详细帮助将不胜感激。
【问题讨论】:
-
什么是
leaf?它不是Tree定义的一部分;我认为它是一个辅助函数,例如leaf x = Node x []? -
FWIW,我将此函数拼写为
maxBranching (Node _ ts) = maximum (length ts:map maxBranching ts)。 -
是的,你猜对了。它被定义为一个智能构造器leaf :: a -> Tree a Leaf x = Node x []
-
@Sniper 请在问题部分包含问题详细信息,而不是评论部分。