在每个参数的列表中映射函数

时间:2011-02-26 08:35:30

标签: haskell list-comprehension

我正在为以下

寻找一些有吸引力的Haskell语法

我有一个需要4个参数的函数。

f a b c d = Something

我想为每个参数提供一个列表,并返回每个组合的结果列表。

基本上是一个嵌套的地图功能。

我觉得应该有一个优雅的解决方案。但是,我还没有找到任何可以编译的内容。

2 个答案:

答案 0 :(得分:6)

你的问题不是很清楚:你想要所有可能的组合(从第一个列表中取任何a,从第二个列表中取任何b等)或者并行处理列表也称为zip(每个列表的第一个元素,第二个元素等等。

使用applicative functor可以很好地解决这两个问题:

Prelude> let f a b c d = (a,b,c,d)
Prelude Control.Applicative> :m +Control.Applicative 
Prelude Control.Applicative> f <$> [1,2] <*> [3,4] <*> [5,6] <*> [7,8]
[(1,3,5,7),(1,3,5,8),(1,3,6,7),(1,3,6,8),(1,4,5,7),(1,4,5,8),(1,4,6,7),(1,4,6,8),(2,3,5,7),(2,3,5,8),(2,3,6,7),(2,3,6,8),(2,4,5,7),(2,4,5,8),(2,4,6,7),(2,4,6,8)]
Prelude Control.Applicative> getZipList $ f <$> ZipList [1,2] <*> ZipList [3,4] <*> ZipList [5,6] <*> ZipList [7,8]
[(1,3,5,7),(2,4,6,8)]

答案 1 :(得分:0)

我想我得到了你想要的东西:

  

四路f为bs cs ds = map(curry4 f)   [(r,s,t,u)| r&lt; - as,s&lt; -bs,t&lt; -   cs,u&lt; -ds]
    其中 curry4 f(a,b,c,d)= f a b c d

你可以自由地做到这一点,但我认为这是你想要的,更容易阅读。