如何在Haskell中生成集合R中所有元组的列表?
在Haskell中生成集合的笛卡尔积元组列表
要生成给定元素范围的所有有序元组(即集合的笛卡尔积),有几种简洁的实现方式:
1. 列表推导式(最直观)
这是Haskell里生成笛卡尔积最常用的方式,直接遍历两个范围的元素组合:
[(x, y) | x <- [1..2], y <- [1..2]]
执行后会得到结果:[(1,1),(1,2),(2,1),(2,2)]
如果需要复用,可以封装成支持任意上下界的函数:
cartesianPairs :: Int -> Int -> [(Int, Int)] cartesianPairs low high = [(x, y) | x <- [low..high], y <- [low..high]]
调用示例:cartesianPairs 1 2 即可返回目标元组列表。
2. 利用Monad特性(函数式风格)
因为列表是Monad实例,可借助Control.Monad中的replicateM生成组合后转换为元组:
import Control.Monad (replicateM) cartesianPairs' :: Int -> Int -> [(Int, Int)] cartesianPairs' low high = map (\[a,b] -> (a,b)) $ replicateM 2 [low..high]
replicateM 2 [low..high]先生成所有长度为2的元素组合列表,再通过map转换为二元组。
3. 用liftM2组合实现
同样借助Control.Monad,用liftM2把元组构造函数(,)作用在两个相同范围上:
import Control.Monad (liftM2) cartesianPairs'' :: Int -> Int -> [(Int, Int)] cartesianPairs'' low high = liftM2 (,) [low..high] [low..high]
这种写法更紧凑,本质和列表推导式等价。
内容的提问来源于stack exchange,提问作者bibo mastar bibomastar
相关产品推荐
相关产品推荐

