编写我自己的最小'功能,无法修复错误

时间:2013-08-08 22:30:20

标签: haskell

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

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

问题是,我得到一个解析器错误:

  

(可能是错误的缩进或括号不匹配)

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

非常感谢您的回答!

3 个答案:

答案 0 :(得分:5)

if (x <= minimum' xs) then x

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

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

minimum' [] = error "empty set - no minimum"
当递归最终以空列表调用minimum'时,

将出错。由于你是在自己练习这个练习,我不会尝试修复它,但要牢记这一点。

答案 1 :(得分:1)

另一种方法:

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

这里你没有两次查看列表的问题。

答案 2 :(得分:1)

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

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

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

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