我需要计算一个列表的最小值,但是我试图在这个类型声明上这样做
Ord a => a - > [a] - >并[a]
它计算给定列表中小于a的那些元素的列表
给定的参数(函数的第一个参数)
mymin :: Ord a => a-> [a] -> [a]
mymin (x:y:xs)
| x > y : mymin(y,xs)
|otherwise
答案 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 b
,if 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)