List 最大哈斯克尔算法
下面的算法有一些错误,我不知道如何修复它,我尝试了,但无法修复 此算法从列表中返回第1个和第2个最大值 谢谢你的帮助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
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)