【问题标题】:How do you iterate in functional languages?你如何迭代函数式语言?
【发布时间】:2014-05-21 11:06:47
【问题描述】:

让我远离像 Lisp 这样的函数式语言的一个原因是我不知道如何进行“原始”数组迭代。比如说,我在 C 中有一个数组,它代表屏幕像素的 RGB 值。在 C 中使用 for 循环更改颜色是微不足道的,但如何在 Lisp 中优雅地做到这一点?

编辑:

抱歉,我的问题措辞不正确。 在 C 语言中,当我想改变屏幕上的颜色时,我只需在数组的一部分上编写一个 for 循环。 但是在方案、clojure 或 haskell 中,所有数据都是不可变的。所以当我改变矩阵的一部分时,它会返回一个全新的矩阵。这有点尴尬。是否有一种“干净”的方法来更改矩阵的一部分的颜色,而无需递归整个数组并制作副本?

【问题讨论】:

  • 是什么让你认为 Lisp 是一种“函数式语言”? (c.f.stackoverflow.com/questions/6021649/…)
  • 在 Lisp 中甚至更简单,因为循环设计模式可以抽象为合适的“映射”程序,为您执行循环。

标签: functional-programming imperative-programming


【解决方案1】:

在函数式语言中,您将使用递归。 递归方案可以命名。

例如,要对数据数组进行递归,对每个像素应用一个函数,您可以手动对数组的结构进行递归:

map f []     = []             
      -- the empty array
map f (x:xs) = f x : map f xs  
      -- apply f to the head of the array, and loop on the tail.

(在 Haskell 中)。

这种递归形式非常常见,在大多数库中被称为map

【讨论】:

    【解决方案2】:

    在像 Lisp 这样的语言中“迭代”数组是一个简单的映射。 结构是(map f x),其中 f 是您希望应用于列表/数组 x 的每个元素的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多