2

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

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

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

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

有谁知道这里有什么问题?这种递归方法甚至可能吗?

非常感谢你的回答!

4

3 回答 3

5
if (x <= minimum' xs) then x

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

此外,阿莫斯罗宾逊提出了一个很好的观点,这个:

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

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

于 2013-08-08T22:34:24.133 回答
1

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

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

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

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

于 2013-08-09T07:04:38.940 回答
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

在这里,您没有两次浏览列表的问题。

于 2013-08-09T01:37:37.697 回答