我正在为以下
寻找一些有吸引力的Haskell语法我有一个需要4个参数的函数。
f a b c d = Something
我想为每个参数提供一个列表,并返回每个组合的结果列表。
基本上是一个嵌套的地图功能。
我觉得应该有一个优雅的解决方案。但是,我还没有找到任何可以编译的内容。
答案 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
你可以自由地做到这一点,但我认为这是你想要的,更容易阅读。