【问题标题】:How to code a buffer in functional programming如何在函数式编程中编写缓冲区
【发布时间】:2020-11-22 15:23:23
【问题描述】:

在强制中断期间,我决定重新访问光线追踪器,但为了有所不同,我决定通过函数式编程而不是命令式来完成。

但是我有一个问题:您如何拥有屏幕外缓冲区?

我有一个colour 类,缓冲区是colour 对象的数组,但如果colour 对象是不可变的,那么您不能简单地用新颜色更新对象。

所以我在考虑 shared_ptrs 的数组,但它正在交换到一个不可变的缓冲区。

所以我的最终方法是制作 16 个(可能更多,也可能更少)colour 对象的条带,并在它们之间建立一个链接列表,当图像完成时,然后将缓冲区复制到屏幕外缓冲区并翻转它。

这是最好的方法还是我在这里错过了一个技巧?

【问题讨论】:

  • 是时候了解M-word...
  • 我理解 Maybe (又名 std::optional),但我似乎无法从那个跳跃到一个大的平面缓冲区?
  • 您需要了解 State,然后使用它的各种化身/兄弟姐妹之一,例如 STArray。
  • 你想学习函数式编程的难点还是简单点?简单的方法是使用函数优先函数式编程语言来学习它:Learn You a Haskell for Great Good!The Book of F#。困难的方法是学习 C++、C#、Lisp、Scala、Rust、JavaScript 或 Swift 中的函数式编程。
  • 我想在自己喜欢的环境中学习函数式编程。过去我曾涉足 Haskell 和 F#:我花更多时间试图弄清楚语言在做什么,而不是它背后的概念。

标签: c++ functional-programming buffer


【解决方案1】:

我对您的图形缓冲区领域一无所知,但您可能正在搜索 persistent data structure:一种比写入时复制更好地为您提供高效不可变更新的数据结构。

恕我直言,Clojure 是其标准库中不可变向量和字典的最佳实现之一,基于 array mapped tries。请参阅here 以获得深入的解释和可能的优化。

此外,还有一种称为 transients 的技术,它允许您为高效的构建器放弃本地不变性,然后可以在共享结果之前将其冻结为不可变结构。这听起来有点像你的想法。

但要知道,使用大型不可变数据结构实现有状态应用程序本身不应是目的,除非您出于具体原因想要保持纯粹。当您在类似actor的组件之间传递东西而不必担心引用透明性或线程安全性时,这很棒,但对于本质上在缓冲区上的更新循环来说可能就不那么重要了。 (这只是对您的“我能为我的日常工作带来什么”评论的回复。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多