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

Haskell编程:定义生成所有可能整数对排列的函数

解决方案

首先确保导入Data.List中的permutations函数,结合你已实现的number函数,我们可以这样定义possibles:

import Data.List (permutations)

-- 你已实现的数字转换函数
number :: [Int] -> Int
number digits = foldl (\acc x -> acc * 10 + x) 0 digits

-- 你已实现的列表拆分函数(当前问题未直接用到,但保留)
splits :: [Int] -> [([Int], [Int])]
splits [] = []
splits [x] = []
splits (x : xs) = ([x], xs) : map f (splits xs)
  where
    f (z, y) = (x : z, y)

-- 目标函数:处理元组列表生成整数对列表
possibles :: [([Int], [Int])] -> [(Int, Int)]
possibles = concatMap processPair
  where
    processPair (aDigits, bDigits) = 
      [ (number aPerm, number bPerm) 
      | aPerm <- permutations aDigits
      , bPerm <- permutations bDigits
      ]

代码解释

  1. permutations的作用:生成输入数字列表的所有可能排列,比如permutations [2,3,4]会返回所有6种3位数字的排列组合。
  2. concatMap的作用:遍历输入列表中的每个元组,对每个元组执行processPair处理,最后把所有结果拼接成一个大列表。
  3. processPair逻辑:
    • 对元组的第一个数字列表aDigits生成所有排列,用number转成整数;
    • 对元组的第二个数字列表bDigits生成所有排列,同样转成整数;
    • 通过列表推导式生成所有可能的整数对组合,覆盖a的每个排列和b的每个排列的配对。

验证示例

输入possibles [([1],[2,3,4]),([1,2],[3,4])]会得到:

[(1,234),(1,243),(1,342),(1,324),(1,423),(1,432),(12,34),(12,43),(21,34),(21,43)]

完全符合预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:45:54