【问题标题】:What is zip (functional programming?)什么是 zip(函数式编程?)
【发布时间】:2010-11-10 01:49:39
【问题描述】:

我最近看到了一些 Clojure 或 Scala(对不起,我对它们不熟悉),它们确实压缩在一个列表或类似的东西上。什么是 zip,它是从哪里来的?

【问题讨论】:

    标签: clojure functional-programming zip


    【解决方案1】:

    Zip 是当您获取两个输入序列并生成一个输出序列时,其中来自同一位置的输入序列的每两个元素使用某个函数组合在一起。 Haskell 中的一个例子:

    输入:

    zipWith (+) [1, 2, 3] [4, 5, 6]
    

    输出:

    [5, 7, 9]
    

    上面是一个更通用的定义;有时,zip 专门将元素组合为元组。例如。再次在 Haskell 中:

    输入:

    zip [1, 2, 3] [4, 5, 6]
    

    输出:

    [(1, 4), (2, 5), (3, 6)]
    

    更通用的版本称为“zip with”。您可以将“zip”视为“zipWith”的特例:

    zip xs ys = zipWith (\x y -> (xs, ys)) xs ys 
    

    【讨论】:

    • 在 scala 中不等价。在 Scala 中,你必须先做一个 zip,然后是一个地图
    • 那么,这并不是真正的“不等价”,只是 Scala 没有zipWith。显然,您可以这样做 - 根据zipWith 定义zip,或者根据zipmap 定义zipWith
    • 如果用户使用的是 Scala,而你给了他们 Haskell,我很确定它不会编译,对吧?这就是我所说的等价。
    • 很难说他在用什么,我的意思是“我最近看到了一些 Clojure 或 Scala”并不完全确定:)
    • 使用 zipWith 的 zip 函数既丑陋又错误。传递给 zipWith 的函数是它的第一个参数......并且将 zip 写成 zip = zipWith (,) 会更好
    【解决方案2】:

    zip 是一种常见的函数式编程方法,如 map 或 fold。你会在早期的 lisps 到 ruby​​ 和 python 中找到这些函数。它们旨在对列表执行常见的批处理操作。

    在这种特殊情况下,zip 获取两个列表并从这些列表中创建一个新的元组列表。

    例如,假设您有一个包含 (1,2,3) 的列表,另一个包含 ("one","two","three") 如果你把它们压缩在一起,你会得到 List((1,"one"), (2,"two"), (3,"three"))

    或者从 scala 命令行,你会得到:

    scala> List(1,2,3).zip(List("one","two","three"))
    res2: List[(Int, java.lang.String)] = List((1,one), (2,two), (3,three))
    

    当我第一次在 Python 中看到它时,不知道函数式编程,我以为它与压缩格式有关。在我更多地了解函数式编程之后,我使用它的次数越来越多。

    【讨论】:

    • 一般什么时候使用zip方式,或者说,zip在实际项目中的典型用例是什么?
    【解决方案3】:

    不幸的是,我没有足够的分数来评论最佳答案,但是

    zip xs ys = zipWith xs ys (\x y -> (xs, ys))
    

    错了,应该是:

    zip xs ys = zipWith (\x y -> (x,y)) xs ys
    

    或者简单地说:

    zip = zipWith (\x y -> (x,y))
    

    【讨论】:

      【解决方案4】:

      您可以在 Python 中使用以下代码:

      
      >>> a = [1,2]
      >>> b = [3,4]
      >>> zip(a,b)
      [(1,3),(2,4)]
      

      【讨论】:

        【解决方案5】:

        Pavel 的回答几乎描述了它。我将仅提供一个 F# 示例:

        let x = [1;2]
        let y = ["hello"; "world"]
        let z = Seq.zip x y
        

        z 的值将是一个序列,其中包含两个序列中相同位置的项目元组:

        [(1, "hello"); (2, "world")]
        

        【讨论】:

          猜你喜欢
          • 2010-09-13
          • 2010-11-04
          • 2016-08-15
          • 2021-10-17
          • 2019-06-04
          • 2018-10-30
          • 2014-05-12
          • 2011-04-01
          • 2010-10-30
          相关资源
          最近更新 更多