在 Haskell 中使用带有列表列表的映射时出现问题
我正在使用 Haskell 解决 euler 项目中的问题 99,其中我必须从基本指数对列表中找到最大结果。
我想出了这个:
prob99 = maximum $ map ((fst)^(snd)) numbers
数字的形式是:
numbers = [[519432,525806],[632382,518061],[78864,613712]..
为什么这不起作用?我需要更改数字的格式吗? 这里是否有我没有想到的简单优化,例如更有效的求幂方法?
I am using Haskell to solve problem 99 in euler project, where I must find the maximum result from a list of base exponent pairs.
I came up with this:
prob99 = maximum $ map ((fst)^(snd)) numbers
Where the numbers are in the form:
numbers = [[519432,525806],[632382,518061],[78864,613712]..
Why doesn't this work? Do I need to change the format of the numbers?
Is there a simple optimisation here I am not thinking of, like a more efficient method of exponentiation?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Jonno,您应该学习如何让 GHC 的错误消息帮助您,以及“
undefined
drop in”方法(现在让我们关注它)。Jonno, you should learn how to let GHC's error messages help you, and the "
undefined
drop in" method (let's focus on that for now).不起作用的是程序的类型一致性。您正在尝试应用函数
(^)
,简化类型Int ->整数-> Int
,对于类型为(a,a) -> 的参数a
(不是 Int)。最简单的方法可能是直接生成对列表而不是列表列表。然后,您(几乎)可以直接将 (^) 函数应用于它们,首先取消柯里化。
如果您对子列表感到困惑,您可以直接对它们进行模式匹配,从而对 Matajon 的解决方案进行一些改进:
或者,如果您一直喜欢无点样式,则可以充分利用
控制.箭头
。 (在这种情况下,就冗长而言没有多大帮助)What's not working is your program's type consistency. You're trying to apply function
(^)
, simplified typeInt -> Int -> Int
, to arguments of type(a,a) -> a
(not an Int).The easiest way would probably be to directly generate a list of pairs instead of a list of lists. You can then (almost) directly appply the (^) function to them, uncurrying it first.
If you're stuck with your sublists, you could pattern-match them directly, improving a bit on Matajon's solution:
Or, if you're into point-free style all the way, you can make good use of the operators in
Control.Arrow
. (which in this case doesn't help much as far as verbosity goes)因为 fst 和 snd 是在对上定义的(类型 fst :: (a,b) -> a 和 snd :: (a,b) -> b)。第二个问题是 (fst)^(snd),你不能对函数进行幂函数。
或者
Because fst and snd are defined on pairs (types fst :: (a,b) -> a and snd :: (a,b) -> b). And second problem is with (fst)^(snd), you cannot power function on function.
or