【问题标题】:minimal value of Binary Tree二叉树的最小值
【发布时间】:2021-12-19 17:58:55
【问题描述】:

我正在尝试使用 foldTree 定义一个 minTree 函数:

foldTree :: (b -> a -> b -> b) -> b -> Tree a -> b
foldTree f e Leaf         = e
foldTree f e (Node left x right) = f (foldTree f e left) x (foldTree f e right)

这是我目前所拥有的。

minTree :: (Ord a) => Tree a -> Maybe a
minTree f e Leaf = e
minTree tree = foldTree f e tree
             where
             f x nothing  = Just x
             f x (Just y) = Just (min x y)
             e            = Nothing

但是这段代码不起作用,并给出了一些我不明白如何修复的错误。有人可以帮我找出问题所在以及如何解决它。

【问题讨论】:

  • nothing 是一个类似于z 的变量。你的意思可能是Nothing。保持启用警告以使 GHC 发现这些类型的错误。此外,f 必须采用 3 个参数才能在 foldTree 中使用。最后,总是发布错误!不发布错误是在强迫我们猜测它,使我们的答案不太准确。
  • 定义中minTree的参数个数不符合签名中的参数个数,在第二行。
  • foldTree 基本上是foldrFoldable 实例中的定义,您只需使用预定义的minimum 函数即可。
  • (尽管minTree 在将非空树传递给minimum 之前仍然需要单独处理一棵空树。)

标签: haskell binary-tree


【解决方案1】:

在您的示例中b ~ Maybe a。这意味着f 的第一个和第三个参数是Maybe as。因此,您需要同时检查两者。第二项是a。因此,您的 f 应该确定两个 Maybe as 和一个 a 的最小值,例如:

minTree :: Ord a => Tree a -> Maybe a
minTree tree = foldTree f Nothing tree
    where f Nothing y Nothing = Just y
          f Nothing y (Just z) = …
          f (Just x) y Nothing = …
          f (Just x) y (Just z) = …

我将实现 部分作为练习。由于aOrd 类型类的成员,因此您可以使用min :: Ord a => a -> a -> a

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2014-08-07
    • 1970-01-01
    相关资源
    最近更新 更多