2

我在 Haskell 中尝试了一些问题(在Spoj),我偶然发现了很多具有以下形式的输入:

testcase_1
testcase_1_continued
testcase_2 
testcase_2_continued

或者

testcase_1 testcase_1_continued
...

words如您所见,仅在输入上使用或lines然后映射求解器函数以得到类似的东西是无法解决这个问题的

[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]
4

2 回答 2

7

使用chunksOf

> map (\[x, y] -> x + y) . chunksOf 2 $ [1..30]
[3,7,11,15,19,23,27,31,35,39,43,47,51,55,59]
于 2012-04-21T17:06:11.037 回答
3

map是一个很好的方法,如果你的数据是这样的结构,你可能想要稍微改变它以更好地适应语义。一种方法是“配对”结果,lines以便获得[(line1, line2),(line3, line4),...]. map 的第一个参数将是一个作用于这些元组的函数。

编辑: 为了对此进行扩展,一般方法是读取输入,将其格式化为语义上有意义的格式,然后将求解函数映射或折叠到结果上。确切的解决方案取决于输入数据。

于 2012-04-21T16:47:28.943 回答