每次将函数映射到Haskell中的列表2个元素
我正在尝试Haskell中的几个问题(at),我偶然发现了不少有表单输入的问题:每次将函数映射到Haskell中的列表2个元素,haskell,Haskell,我正在尝试Haskell中的几个问题(at),我偶然发现了不少有表单输入的问题: testcase_1 testcase_1_continued testcase_2 testcase_2_continued 或 如您所见,仅使用输入上的单词或行,然后映射解算器函数以获得类似于 [solver test1, solver test2, ...] 应使用带有两个参数的函数,这两个参数是两个列表元素,一个接一个,并获得: [solver test1 test1continued, solver
testcase_1
testcase_1_continued
testcase_2
testcase_2_continued
或
如您所见,仅使用输入上的单词
或行
,然后映射解算器函数以获得类似于
[solver test1, solver test2, ...]
应使用带有两个参数的函数,这两个参数是两个列表元素,一个接一个,并获得:
[solver test1 test1continued, solver test2 test2continued, ...]
因此,我很高兴找到一个类似于map
的函数,它一次应用一个函数2个参数。我在Hoogle上找不到任何东西,无论编写这样一个函数多么容易,我都在寻找一种更通用的方法来解决这个问题。或者,如果我的方法(坚持map
)这肯定是错误的,你也可以给我指出正确的方向
编辑:
实际上,我发现实现一个函数map2非常有用,它将一个函数映射到一个列表,一次只能使用两个参数:
map2 f [a,b,c,d] ==> [f a b, f c d]
map
是一种很好的方法,如果您的数据是这样的结构,您可能需要稍微修改它以更好地适应语义。一种方法是将行的结果“配对”
,从而得到[(第1行,第2行),(第3行,第4行),…]
。map的第一个参数将是一个作用于这些元组的函数
编辑:
要扩展这一点,一般的方法是读取输入,将其格式化为语义上有意义的格式,然后将求解函数映射或折叠到结果上。精确的解决方案取决于输入数据。使用
惯用的Haskell是使用
zipWith
并沿着列表和同一列表的尾部(短一个元素)压缩。可以说,Data.List应该有一个直接执行此操作的函数,但Data.List已经相当大了。@Stephentelley:这将为您提供重叠的相邻元素对,例如[(1,2)、(2,3)、(3,4),…]
,而如果我正确理解OP,他希望它们不重叠,例如[(1,2)、(3,4),…]
请注意,如果列表中的元素数为奇数,则会导致最后一个元素的模式匹配失败。类似的[x+y |[x,y]@hammar spoj应该只给出有效的测试用例。哇,这是一个嵌入haskell模块的函数!更新了使用chunksOf
chunk
的答案。只是为了澄清:chunk
不推荐使用是因为邮件列表循环,而不是因为任何删除它的意图。所以选择chunksOf
或块
,以满足您自己的审美需求。
map2 f [a,b,c,d] ==> [f a b, f c d]
> map (\[x, y] -> x + y) . chunksOf 2 $ [1..30]
[3,7,11,15,19,23,27,31,35,39,43,47,51,55,59]