【问题标题】:All-to-all pairings of two lists in Haskell without list comprehension在没有列表理解的情况下,Haskell 中两个列表的全部配对
【发布时间】:2016-04-25 19:40:51
【问题描述】:

我正在阅读 Bird 和 Wadler 在函数式编程方面的好书 并尝试解决 Haskell 中的练习。

关于列表的章节有一节说任何列表理解 可以根据mapfilterconcat 以及map 可能需要的辅助功​​能来实现

我无法根据这些构建块来实现以下表达式。

[(x,y) | x<- xs, y<- ys]

如何为此使用地图和过滤器?

我做到了

concat [ map (\ a -&gt; (a,x)) ys | x&lt;-xs ]

我怀疑我们必须在这里巧妙地使用柯里化,但我似乎无法弄清楚。

【问题讨论】:

标签: list haskell functional-programming


【解决方案1】:

对于每个x,你需要所有ys 所以:

\x -> map (\y -> (x,y)) ys

现在您只需将其映射到所有 xs

cross xs ys = map (\x -> map (\y -> (x,y)) ys) xs

示例:

> cross [1..3] "AB"
[[(1,'A'),(1,'B')],[(2,'A'),(2,'B')],[(3,'A'),(3,'B')]]

【讨论】:

  • 非常好!非常感谢!
【解决方案2】:

虽然我不确定 ApplicativeDo 是否被允许作为“构建块”的一部分,但如果允许,可以通过将元组函数映射到第一个列表并将该列表应用于第二个列表来轻松实现。

import Control.Applicative

let xs = [1,2,3]
    ys = [4,5,6]

(,) <$> xs <*> ys

结果:

[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多