将函数映射到Haskell 2元素中的列表一次

时间:2012-04-21 16:43:11

标签: haskell

我正在Haskell中尝试一些问题(在Spoj处)并且偶然发现了一些有输入形式的问题:

testcase_1
testcase_1_continued
testcase_2 
testcase_2_continued

testcase_1 testcase_1_continued
...

正如您所看到的那样,只需在输入上使用wordslines,然后将求解器函数映射到类似

的内容,就无法解决这个问题。
[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]

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:3)

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

修改 为了扩展它,通常的方法是读取输入,将其格式化为语义上有意义的格式,然后在结果上映射或折叠求解函数。确切的解决方案取决于输入数据。