List 最大哈斯克尔算法

List 最大哈斯克尔算法,list,haskell,functional-programming,List,Haskell,Functional Programming,下面的算法有一些错误,我不知道如何修复它,我尝试了,但无法修复 此算法从列表中返回第1个和第2个最大值 谢谢你的帮助 maxmimum [] = [] maxmimum [head] = [head] maxmimum [head1 : head2 : maradek] | head1 > head2 = maxmimum2 maradek head1 head2 | otherwise = maxmimum2 maradek head2 head1 --maxmimu

下面的算法有一些错误,我不知道如何修复它,我尝试了,但无法修复

此算法从列表中返回第1个和第2个最大值

谢谢你的帮助

maxmimum [] = []  
maxmimum [head] = [head] 
maxmimum [head1 : head2 : maradek] 
  | head1 > head2 = maxmimum2 maradek head1 head2 
  | otherwise = maxmimum2 maradek head2 head1

--maxmimum2 :: [Int] Int Int -> [Int]

maxmimum2 [] head1 head2 = [head1, head2] 
maxmimum2 [head : maradek] head1 head2    
  | head > head1 = maxmimum2 maradek head head1
  | head > head2 = maxmimum2 maradek head1 head
  | otherwise = maxmimum2 maradek head1 head2

模式中的解析错误:maxmimum

首先,您可能希望给出显式类型签名,因为这并没有说明您可能认为它在说什么

maxmimum [head1 : head2 : maradek] 
也就是说你有一个列表。outter列表只有一个元素,它本身就是一个长度至少为两个的列表。类型为
[[a]]
。我想,您想要的是
最大值(head1:head2:restOfList)=……


同样的问题出现在
maximum2
[head:maradek]
应该是
(head:maradek)
)。您为maximum2注释的类型签名几乎是正确的(一旦您使用此修复程序),您只需添加箭头(函数已完成):
maximum2::[Int]->Int->Int->[Int]

首先请写下如下类型签名

(reverse $ sort [1, 6, 2, 7 ,8]) !! 0
(reverse $ sort [1, 6, 2, 7 ,8]) !! 1
maximum :: Ord a => [a] -> a
它使思考函数的方式更容易。 因此,在本例中,我们有一个函数,它获取可比较事物的列表(
Ord a=>[a]
),并为我们提供一个-它们的最大值

maximum :: Ord a => [a] -> a
maximum [] = undefined
maximum [x] = x
maximum (x1 : x2 : xs)
  | x1 > x2 = maximum (x1 : xs)
  | otherwise = maximum (x2 : xs)
其次,给事物命名,这样其他人就不会感到困惑——我不知道马拉德克是什么或可能是什么,在哈斯凯尔,通常“x列表”用xs表示

现在让我们测试一下我们的
最大值
-函数:

> ghci maximum.hs
>>> maximum []
*** Exception: Prelude.maximum: empty list
>>> maximum [1..10]
    10
>>> maximum [10,9..1]
    10
>>> maximum "alpha,beta,gamma"
    't'
>>> maximum [1.0,1.1..10.0]
    10.000000000000053
一切正常:emptylist上出现错误,整数和字符出现最大值,只有最后一个是意外的,因为这是处理浮点数和舍入错误的一个奇怪之处

编辑 在评论之后,我误读了op的问题(对此我非常抱歉!)

因此,我希望这是一个预期的解决方案

> ghci maximum.hs
>>> maximum []
*** Exception: Prelude.maximum: empty list
>>> maximum2 [1..10]
    (10,9)
>>> maximum2 [10,9..1]
    (10,9)
>>> maximum2 [9,19,10,23]
    (23,19)
>>> maximum "alpha,beta,gamma"
    ('t','p')
>>> maximum [1.0,1.1..10.0]
    (10.000000000000053,9.900000000000052)
>>> maximum2 (10:[1..10])
    (10,10)

我不知道最后的结果是否如预期的那样,或者是否应该有
(10,9)

如果他能够利用更大的库函数,那么你是对的,只需做
取2。相反。排序
,但这是家庭作业,他基本上有正确的答案。我认为我们应该鼓励他继续发展他所拥有的,并理解什么是错误的。我只想说,对名单进行排序并获得前两名成员更容易。他可以按库函数排序,也可以创建自己的排序函数——这无关紧要。重申一下,
[head1:head2:…]
[[head1,head2,…]
相同,而
(head1:head2:…)
[head1,head2,…]
操作符建立一个列表,周围的
[]
构建另一个列表。“maxmimum2::[Int]Int->[Int]”这对代码很重要?或者更容易理解?类型签名可能会导致生成的代码发生更改,但通常不会,也不会以您现在应该关注的方式。它通常是关于文档的,帮助您获得更好的错误消息(如果您的代码说了一件事,而您的类型签名说了另一件事,那么编译器将能够为该函数提供一个错误,而不是当您将该函数应用于错误的类型时出现的错误)。实际上,我只是复制了您的版本并整理了一下。但是,这并没有产生两个最高的数字,这显然是OP正在解决的问题。
> ghci maximum.hs
>>> maximum []
*** Exception: Prelude.maximum: empty list
>>> maximum2 [1..10]
    (10,9)
>>> maximum2 [10,9..1]
    (10,9)
>>> maximum2 [9,19,10,23]
    (23,19)
>>> maximum "alpha,beta,gamma"
    ('t','p')
>>> maximum [1.0,1.1..10.0]
    (10.000000000000053,9.900000000000052)
>>> maximum2 (10:[1..10])
    (10,10)