代码之家  ›  专栏  ›  技术社区  ›  valerius21

在haskell中使用双变量列表理解

  •  1
  • valerius21  · 技术社区  · 7 年前

    有人知道我如何用Haskell中的两个变量来理解列表吗?

    前任。

    [ x * y  | x <- [1..10]  y <- [1..10]]
    

    它应该会导致

    [1,4,9,16,25,36,49,64,81,100]
    

    但它实际上在温室气体排放量中产生了

    <interactive>:13:23-24: error:
        parse error on input ‘<-’
        Perhaps this statement should be within a 'do' block?
    
    2 回复  |  直到 7 年前
        1
  •  7
  •   willeM_ Van Onsem    7 年前

    这里有两个问题:A 句法的 一个,还有一个 语义的 一个。

    一个有效的列表理解表达式

    语法上的一个问题是,你把列表理解的各个部分分开(这些可以是 发电机 , 过滤器 let 条款) 逗号( , ) :

    [ x * y  | x <- [1..10], y <- [1..10]]

    但现在我们会的 获得所需的输出。的确:

    Prelude> [ x * y  | x <- [1..10], y <- [1..10]]
    [1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30,4,8,12,16,20,24,28,32,36,40,5,10,15,20,25,30,35,40,45,50,6,12,18,24,30,36,42,48,54,60,7,14,21,28,35,42,49,56,63,70,8,16,24,32,40,48,56,64,72,80,9,18,27,36,45,54,63,72,81,90,10,20,30,40,50,60,70,80,90,100]
    

    我们这里有两个整数之间的所有乘法 1 10 . 因为每一个 x 在列表中 [1..10] ,我们遍历列表 [1..10] 对于 y . 但是,这与您请求的列表不匹配,因此会出现语义错误。

    获取方块列表

    你想要的是一张清单 广场 数字。在这种情况下,只有 变量 X ,对于每个值 X ,我们屈服 x*x :

    [ x * x  | x <- [1..10]]

    然后产生:

    Prelude> [ x * x  | x <- [1..10]]
    [1,4,9,16,25,36,49,64,81,100]
    

    并行枚举列表

    如果您有两个要并行枚举的列表,可以使用 zip 例如,如果我们想多方面地 [1..10] 与元素 [5..14] 元素方面 我们可以通过以下方式来实现:

    [ x * y  | (x, y) <- zip [1..10] [5..14]]
        2
  •  4
  •   chepner    7 年前

    您需要将这两个范围压缩在一起:

    [ x * y | (x, y) <- zip [1..10] [1..10] ]
    

    可以 有两个独立的迭代器,用逗号分隔

    [ x * y | x <- [1..10], y <-[1..10] ]
    

    但这会计算两个集合的笛卡尔积,从而得到一个完整的乘法表,而不是一个正方形列表。