为了探索可能性,我一直想编写自己的最小函数(我是Haskell的新手)。
minimum' :: (Ord a) => [a] -> a
minimum' [] = error "empty set - no minimum"
minimum' (x:xs) = if (x <= minimum' xs) then x
问题是,我得到一个解析器错误:
(可能是错误的缩进或括号不匹配)
有谁知道这里的问题是什么?这种递归方法是否可行?
非常感谢您的回答!
答案 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 = ...
然后,使用辅助函数递归。