2011-02-26 124 views
0

我正在寻找下面的一些有吸引力的Haskell语法在列表中为每个参数映射一个函数

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

F A B C d =东西

我想提供一个列出了每个参数并取回每个组合的结果列表。

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

我倒像应该有一个优雅的解决方案。但是,我还没有发现任何可以编译的东西。

+2

我不确定你想要什么。请你能展示一些例子的输入和输出吗? – 2011-02-26 08:43:56

+2

你能改说吗?你在找zip4吗?或zipWith4?你正在寻找的功能的类型是什么? – Xoltar 2011-02-26 08:46:08

回答

6

你的问题不是很清楚:做你想做的所有可能组合(以从第一个列表中的任何a,从第二等的任何b)或处理列表并行又名拉链(每个列表的第一个元素时,第二个元素等)。

既可以很好地解决了应用性函子:

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)] 
+0

当涉及到纯语法时,请参阅http://personal.cis.strath.ac.uk/~conor/pub/she/idiom.html。 – barsoap 2011-02-26 10:15:46

+0

我想OP是询问其中的第一个,这恰好是我最喜欢的List应用实例的用法。 – 2011-02-26 12:30:58

+1

第二个选项有一个普通的功能:zipWith4 f [1,2] [3,4] [5,6] [7,8] – 2011-02-27 00:14:28

0

我觉得我得到你在找什么:

fourway˚F为BS CS DS =地图(curry4 F) [ (r,s,t,u)| ř< - 如,S < - BS,T < - CS中,u < - DS]
其中 curry4 F(A,B,C,d)= fabcd

你可以这样做点自由和可爱,但我认为这是你想要的,更容易阅读。

相关问题