作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码,旨在获取 a
的列表的,以及 b
的列表's,并返回所有配对 [(a, b)],使得
a
和每个 b
每个配对只出现一次。 (a, b)
满足某些条件 cond
,即 cond :: a -> b -> Bool
. [[(1, x), (2, y)]
[(1, x), (2, z)]
[(1, y), (2, x)]
[(1, y), (2, z)]
[(1, z), (2, x)]
[(1, z), (2, y)]]
someFn :: [a] -> [b] -> [ [(a, b)] ]
someFn [] _ = []
someFn (a : as) bs = [ [(a,b)] ++ rest | b <- bs, rest <- someFn as (bs \\ [b]), cond a b]
最佳答案
从您的解释中我可以理解的是,您想根据两个列表的乘积的某些条件进行过滤。使用列表理解来获取列表的乘积很容易,然后过滤器函数会将乘积减少到仅满足给定条件的对
foo :: [a] -> [b] -> (a -> b -> Bool)-> [(a,b)]
foo x y with = filter (uncurry with) [(a,b) | a <- x, b <- y]
bar :: [a] -> [b] -> [[(a,b)]]
bar xs ys = map (zip xs) $ permutations ys
biz :: (a -> b -> Bool) -> [[(a,b)]] -> [[(a,b)]]
biz = map . filter . uncurry
关于haskell - 用高阶函数代替显式递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19300657/
我是一名优秀的程序员,十分优秀!