algorithm - 在 Haskell 的列表推导中构建列表列表

标签 algorithm haskell pattern-matching

我在 wiki.haskell.org 上找到了一种算法,用于从给定列表中生成 n 个元素的组合。它构建[[a]]通过列表理解。

combos :: Int -> [a] -> [[a]]
combos 0 _  = [ [] ]
combos n xs = [ y:ys | y:xs' <- tails xs
                           , ys <- combos (n-1) xs']

假设我们执行 combos 2 [1,2,3] ,那么主要功能将如下所示:

combos 2 [1,2,3] = [ y:ys | y:xs' <- [[1,2,3],[2,3],[3],[]]
                           , ys <- combos 1 xs']

我假设在一个模式中 y:xs' y是一个列表(第一次运行时为 [1,2,3])和 xs'是列表的列表(第一次运行时为 [[2,3],[3],[]])。

我对这部分感到困惑,当 xs'作为递归 combos 的参数抛出调用 ( ys <- combos 1 xs') . ( combos 现在变成 [[a]] -> [[[a]]] ?)

一切进展如何?你能描述一下这个功能是如何工作的吗?

最佳答案

注意 … <- … 之间的区别和 let … = …这里。在列表理解中,x <- xs 的两边不能有相同的类型; x依次分配给 xs 的每个元素 .

在您的示例中,(y:xs') <- [[1,2,3],[2,3],[3],[]]意味着我们从该列表中获取 与模式 (y:xs') 匹配的元素.所以我们第一次在这里进行选择,y == 1xs' == [2,3] ;第二次我们进行选择,y == 2xs' == [3]等等。

关于algorithm - 在 Haskell 的列表推导中构建列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41091780/

相关文章:

scala - 键入以捕获整数、 float 或字符串值,然后在 Scala 中进行模式匹配

java - 图像比较算法

algorithm - 如何使用快速排序找到 K 个最小值

algorithm - 完整图分量数

haskell - 限制 Haskell 中数据类型值的字符串长度

haskell - 为什么 GHC 拒绝允许这种存在类型函数?

haskell - 使用 ContT 构造函数创建新的 Monad Cont

函数签名中的 F# 模式匹配

scala - 使用未应用功能丰富 PartialFunction

arrays - 非连续元素的最大总和(来自任意位置的 k 个元素)