You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:15:43