列表元素小于某个值

时间:2014-12-04 10:33:05

标签: haskell minimum

我需要计算一个列表的最小值,但是我试图在这个类型声明上这样做 Ord a => a - > [a] - >并[a]
它计算给定列表中小于a的那些元素的列表 给定的参数(函数的第一个参数)

mymin :: Ord a => a-> [a] -> [a]

mymin (x:y:xs)   
        | x > y : mymin(y,xs)  
            |otherwise 

3 个答案:

答案 0 :(得分:2)

只需使用filter即可。它是为过滤列表而制作的:

mymin :: Ord a => a -> [a] -> [a]
mymin x = filter (< x)

答案 1 :(得分:0)

你可能应该阅读一些基本的Haskell指南......仍有两个提示可以解决这个问题:

  • 从基本案例开始:空列表和任意枢轴元素的预期输出是什么?
  • mymin有两个参数,因此代码的第一行应该是mymin y (x:xs)

编辑:第二个想法,您是否考虑过使用filter

答案 2 :(得分:0)

注意:重新阅读问题之后,您可能只想过滤其他答案中提到的列表,我的回答主要集中在找到列表最小元素的初始要求上。无论如何我会发布它,希望有人发现它很有用。


您的警卫语法不正确,但您几乎已经拥有了您所拥有的内容。看一下名为"Guards, guards!" in learn you a haskell的部分。通过Guards,您可以在函数定义中包含多个语句,如if a then bif c then d

您需要包含otherwise案例的定义,您已将其删除。

在您的代码中,您还应排列|个字符,空格很重要,并更改编译器/解释程序运行程序的方式。

我想我可以通过mymin(y,xs)看到你要去的地方,就像你试图传回Ord a => a-> [a] -> [a]类型的函数一样。然而,正如你所知,它不会起作用。您当前的定义mymin (x:y:xs)仅匹配Ord a => [a] -> [a],它缺少参数。

如果您希望递归传递最小值,则需要提供如下定义:

mymin :: (Ord a) => a -> [a] -> a
mymin x (y:ys)

扩展你的工作我已经提出以下建议。它返回列表的最小元素,但没有为空列表定义(它会出错)。它与您所获得的一致,但是在列表的第一个索引中保留最小的找到的项目,而不是将其作为单独的函数参数传递:

mymin :: Ord a => [a] -> a
mymin zs = head . mymin' $ zs
  where mymin' (x:[]) = [x]
        mymin' (x:y:xs)
          | x > y = mymin' (y:xs)
          | otherwise = mymin' (x:xs)