【问题标题】:Function that generates a list of all possible lists given the elements a position can take are specified给定位置可以采用的元素,生成所有可能列表的列表的函数
【发布时间】:2020-02-01 21:27:30
【问题描述】:

在 Haskell 中,我正在寻找一个输入 [[a]] -> [[a]] 的函数,它在给定参数 [[1], [1,2], [1,2,3]] 的情况下生成一个列表,例如 [[1,1,1], [1,1,2], [1,1,3], [1,2,1], [1,2,2], [1,2,3]]。鉴于每个元素都可以采用某些特定值,该函数应该生成所有可能列表的列表。所以对于上面的例子,在所有可能的列表中,第一个元素可以取[1] 中的任何值,第二个可以取[1,2] 中的任何值,第三个可以取[1,2,3] 中的任何值。每个列表的大小应与作为参数传入的列表中的列表数量相同(在上述情况下为 3,因为[[1], [1,2], [1,2,3]] 中有三个列表)。

为了实现这一点,我查看了replicateM 函数,但这假设每个元素可以采用相同数量的值。是否有一个函数可以指定不同的元素可以采用不同的值?如果没有,实现这个功能的功能是什么样的?

【问题讨论】:

  • 这个函数被称为列表的笛卡尔积
  • \i -> replicateM i == \i -> sequence . replicate i.

标签: list haskell functional-programming


【解决方案1】:

这个函数是

sequenceA :: (Applicative f, Traversable t) => t (f a) -> f (t a)

专门用于列表,即(f ~ [], t ~ []),产生

sequenceA :: [[a]] -> [[a]]

> sequenceA [[1], [1,2], [1,2,3]]
[[1,1,1],[1,1,2],[1,1,3],[1,2,1],[1,2,2],[1,2,3]]

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多