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

Haskell如何生成特定组合规则的三元组列表?

如何创建符合特定模式的三元组列表?

给定以下输入:

a = 100

b = [10,20,30]

c = ['a','b','c','d','e','f','g']

期望生成所有(a, x, y)形式的三元组(其中x取自b,y取自c),输出如下:

[(100,10,'a'),(100,10,'b'),(100,10,'c'),(100,10,'d'),(100,10,'e'),(100,10,'f'),(100,10,'g'),
 (100,20,'a'),(100,20,'b'),(100,20,'c'),(100,20,'d'),(100,20,'e'),(100,20,'f'),(100,20,'g'),
 (100,30,'a'),(100,30,'b'),(100,30,'c'),(100,30,'d'),(100,30,'e'),(100,30,'f'),(100,30,'g')]

你已经实现了处理两个参数生成二元组的递归函数:

makeTuple :: Int -> [Int] -> [(Int,Int)]
makeTuple _ [] = []
makeTuple i (x:xs) = [(i,x)] ++ makeTuple i xs

扩展到三元组的几种方法

1. 递归扩展法

基于你现有的递归思路,我们可以对b中的每个元素,再遍历c的所有元素生成三元组,然后拼接结果:

makeTriple :: Int -> [Int] -> [Char] -> [(Int, Int, Char)]
makeTriple _ [] _ = []  -- b为空时返回空列表
makeTriple i (x:xs) cs = 
  map (\y -> (i, x, y)) cs  -- 用当前x和c中所有y生成三元组
  ++ makeTriple i xs cs     -- 递归处理b的剩余元素

2. 列表推导式(推荐)

Haskell的列表推导式可以更简洁清晰地表达这种组合逻辑,直接生成所有符合要求的三元组:

makeTriple :: Int -> [Int] -> [Char] -> [(Int, Int, Char)]
makeTriple i bs cs = [(i, x, y) | x <- bs, y <- cs]

这个写法直观体现了需求:遍历bs中的每个x,再遍历cs中的每个y,将i、x、y组合成三元组,顺序和你期望的输出完全一致。

3. List Monad的do表示法

利用Haskell的列表Monad特性,用do语法也能实现同样的效果,本质和列表推导式等价:

makeTriple :: Int -> [Int] -> [Char] -> [(Int, Int, Char)]
makeTriple i bs cs = do
  x <- bs
  y <- cs
  return (i, x, y)

额外优化:简化原二元组函数

其实你原来的二元组生成函数也可以用列表推导式简化,避免递归拼接的繁琐:

makeTuple :: Int -> [Int] -> [(Int,Int)]
makeTuple i bs = [(i, x) | x <- bs]

内容的提问来源于stack exchange,提问作者tdeus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:01:16