【问题标题】:Writing my own minimum' function, can't fix a bug编写我自己的最小函数,无法修复错误
【发布时间】:2013-08-08 22:30:19
【问题描述】:

我一直想写我自己的最小函数只是为了探索可能性(我是 Haskell 的新手)。

minimum' :: (Ord a) => [a] -> a
minimum' [] = error "empty set - no minimum"
minimum' (x:xs) = if (x <= minimum' xs) then x

问题是,我遇到了解析器错误:

(可能缩进不正确或括号不匹配)

有人知道这里有什么问题吗?这种递归方法是否可行?

非常感谢您的回答!

【问题讨论】:

  • 您还需要处理单元素案例[a]
  • 制作接口函数:myMinimum [] = ..... ; myMinimum (x:xs) = minimumAux x xs.

标签: haskell


【解决方案1】:
if (x <= minimum' xs) then x

在 haskell 中,if/else 构造作为一个整体必须返回一个值,因此您需要一个匹配的 else 到您的 if。

此外,Amos Robinson 提出了一个很好的观点,这是:

minimum' [] = error "empty set - no minimum"

当递归以空列表调用 minimum' 时会出错。由于您是自己练习,因此我不会尝试修复它,但请记住这一点。

【讨论】:

  • 可能值得注意的是,幼稚的 if x &lt;= minimum' xs then x else minimum' xs 看起来像是在计算最小值两次,但称为公共子表达式消除的优化将可能将其提升,因此它只是计算一次。耶纯洁!
  • @AmosRobinson No, it won't.
  • 是的。或者,也可以定义一个min' 函数(或在允许的情况下使用现有的min 函数)来完全避免if。
  • 啊,你是对的! CSE 仅适用于仅限于a~Int 的情况。我们还应该注意 []=error 也会导致归纳大小写错误
  • @AmosRobinson 你的意思是说基本情况,对吧?在 inductively 定义的 datatype 上的递归函数中有基本情况和递归情况。 :)
【解决方案2】:

另一种方法:

mini :: Ord a => [a] -> a
mini [] = error "empty set"
mini (x:xs) = foldr (\x y -> if x > y then y else x) x xs

在这里,您不会遇到遍历列表两次的问题。

【讨论】:

  • 即使它是一个有效的解决方案,它也不能回答问题。
  • 是的,但是问题出现在 cmets 中。
【解决方案3】:

正如其他人所提到的,解析器抱怨您忘记了if-语句的else-部分。即使您使该函数正常工作,您也必须为minimum' [] 定义一个返回值。对于任何给定的输入类型,您必须返回最大的可表示值,因此您只能使用 Bounded-typeclass 的实例类型。

找到不依赖于有界输入的最小值的更好方法是简单地遍历列表,同时跟踪迄今为止遇到的最小元素。为了跟踪一个值,您必须定义一个辅助函数,如下所示:

minimum' []     = error "minimum' of empty list"
minimum' (x:xs) = minAux x xs
  where minAux y ys = ...

然后,使用辅助函数进行递归。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多