- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为了“好玩”,为了学习函数式编程,我正在用 Clojure 开发一个程序,它使用这种称为“Westergaardian 理论”的音乐理论中的思想进行算法作曲。它生成音乐线(其中一条线只是一个谱表,由一系列音符组成,每个音符都有音高和持续时间)。它基本上是这样工作的:
我遇到的问题是我的实现速度很慢,我怀疑它可以做得更快。我是 Clojure 和一般函数式编程的新手(虽然我有 OO 经验),所以我希望有更多经验的人可以指出我是否没有考虑函数式范式或错过了一些 FP 技术.
我目前的实现是每一行都是一个包含 map 的向量。每张 map 都有一个 :note 和一个 :dur。 :note 的值是代表音符的关键字,如 :A4 或 :C#3。 :dur 的值是一个分数,代表音符的持续时间(1 是一个完整的音符,1/4 是一个四分音符,等等)。因此,例如,代表从 C3 开始的 C 大调音阶的线如下所示:
[
{:note :C3 :dur 1}
{:note :D3 :dur 1}
{:note :E3 :dur 1}
{:note :F3 :dur 1}
{:note :G3 :dur 1}
{:note :A4 :dur 1}
{:note :B4 :dur 1}
]
让我们忽略使用向量 (that's covered in a different question) 的问题。我想专注于提高确定哪些音符对通过了给定操作的标准的速度。
问题是,每个操作都必须查看哪些相邻的音符对符合其条件。目前,这是 O(n),其中 n 是线的大小(它只是遍历整条线并查看每一对),这意味着即使我解决了使用向量的问题,它仍然会很慢。然而,标准检查的好处是它只需要重新评估邻居发生变化的音符(因为每对的标准独立于行中的其他音符)。我不确定我将如何在 Clojure 中跟踪这一点,以便算法跟踪哪些对是脏的,哪些是干净的,并且只能重新评估脏的音符对。从范例的角度来看,使用 map 包围线路并添加元数据来跟踪它是否可以?例如,我会有这样的结构:
{
:line [<the elements of the line>]
:dirty [<indexes of notes that need to be re-checked>]
:valid {
operation1 [<indexes of notes that operation 1 can be performed on>]
operation2 [<indexes of notes that operation 2 can be performed on>]
...
}
}
我怎么能做这样的事情,但让它成为一个很好的抽象?这样一来,每次我想对它做些什么时,我就不必记住它的结构了。是否有一些 Clojure 语言功能可用于对此进行抽象?或者这不是一个好方法吗?我正在考虑在 OO 中抽象出这样的实现细节是多么容易(例如,如果我想说给定的音符现在是脏的,我可以做类似 .setDirty(index) 的事情,而不是直接访问向量).我确信在 Clojure/函数式编程中有办法做到这一点。
这看起来是一种跟踪“脏”笔记的好方法吗?我如何在 Clojure 中对此进行编码以使其易于使用(进行很好的抽象,这样我就不必记住 map 的结构)。
最佳答案
Clojure protocols和 records有点类似于面向对象的接口(interface)和类。在这种情况下,您可以定义一个协议(protocol)来抽象一行中的基本方法:
(defprotocol LineProtocol
(extend [this])
(note-seq [this])
(length [this]))
其中 extend
通过对随机适用的音符对应用随机操作生成新行,length
返回行中的音符数,note- seq
返回行中的音符序列。
然后给定一条初始线,您可以通过以下方式获得所需长度的线:
(->> line
(iterate extend)
(drop-while #(< (length %) desired-length))
first
note-seq)
您心目中的抽象实现可能看起来像
(defrecord Line [notes valid dirty]
LineProtocol
(extend [this] (->Line ...)) ;calc new line from this line's state
(length [this] (count notes))
(note-seq [this] (seq notes)))
如果 notes
是一个向量。 (->Line
是由 defrecord
调用生成的工厂方法。)
我认为您的实现似乎走在了正确的轨道上,但我认为您必须评估每次调用 extend
时的所有脏笔记。
关于algorithm - 我怎样才能提供一个很好的、易于使用的抽象来跟踪列表的 "dirty"元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24132238/
我开发了一个具有基本安全性的 Spring Boot 应用程序。我有两个具有相同路径和不同 http 方法的端点。当我使用默认密码/使用 application.yml 中给出的密码包含基本安全性时,
我的代码是这样的: 或者,像这样: 如果我首先列出 webm 源,Firefox 4 会播放它,但 Firefox 3.6 也会尝试播放它(但会失败,因为它不支持 webm)。
我希望提供一个泛型类型作为类型参数而不首先将其解析为具体类型。换句话说,我正在寻找一种方法来指定从基类继承时可以使用的类型映射函数。 示例(不正确的)语法,希望比我能解释得更好: abstract c
我在 .NET 中编写了一些桌面应用程序,它们既提供了用于正常使用的前端 GUI,也提供了用于其他需求(例如扩展、调度、自动化、高级使用等)的命令行界面。命名两个可执行文件的最佳做法是什么,因为它们构
我最近在这里思考了很多关于屏幕抓取以及它可能是一项什么样的任务。所以我提出以下问题。 作为网站开发人员,您是否会公开简单的 API 以防止用户抓取屏幕,例如 JSON 结果? 然后这些结果可以实现缓存
我正在为一个项目使用 Dojo 1.9,但我不明白 dojo.provide 的正确替代方案与传统风格相比,AMD 风格。我正在阅读 this文档页面。 很明显,这就是旧语法映射到新语法的方式: 旧
我正在开发一个 Angular 应用程序。当我使用 ng serve 正常运行它时,它运行没有任何错误.但是,当我运行 ng build --prod ,它给出了以下错误。 ERROR in Ille
我有一个 Mac 应用程序。在我的 Mac 应用程序中,我的屏幕之一有一个包含文本字段的 scrollView。在同一屏幕上,我有一个需要提供打印选项的按钮。可以打印文本字段的文本。打印按钮应调用 M
我已经成功地为普通媒体文件提供媒体文件,但是当我尝试提供管理媒体文件时,我失败了。请帮我找出问题所在,因为我已经尝试解决问题几个小时但没有运气(也一直在谷歌搜索并阅读有关提供静态文件的 django
我正在尝试创建一个简单的错误处理项目,它会在收到错误(例如 404、422 或 500)后为 JSON 提供错误数据。我使用来自 this 的代码网站,但它不适合我。 我实际上有这两个类: 基本 Co
假设我有一个名为 Number 的类(class),我打算对 Number 进行大量相等比较对象。我担心通用 Number::equals(Object o) 的“开销”(类比较等...)方法。在这种
假定以下情况: 对等方A只希望将音频流发送给对等方B 对等B只希望将视频流发送给对等A 从而, 与创建报价 var sdpConstraints = { “必填”:{ 'OfferToReceiveA
因为我有一些角度,所以我想检查角度模数 360°: double angle = 0; double expectedAngle = 360; angle.Should().B
这是我的程序中构建的 monad 堆栈: type Px a = ReaderT PConf (State PState) a 其中 PConf 和 PState 是保存应用程序的配置和状态的任意数据
因为我有一些角度,所以我想检查角度模数 360°: double angle = 0; double expectedAngle = 360; angle.Should().B
我有一个小程序需要以某些权限运行,这意味着加载时会显示一条警告消息。如果用户拒绝警告消息,我想重定向到错误页面并解释发生了什么。有什么办法可以做到这一点吗? 我研究过让计时器运行并在特定时间段后重定向
从我可以从 Firebase 文档中推断出,似乎需要服务器来提供静态内容(html和 javascript),所以你需要有一台托管机器和一个静态内容服务器在某处启动并运行,或某些服务托管静态站点。 对
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 3 年前。 Improv
我的项目根目录的静态文件夹中有一个文本文件。 我想提供它,所以我创建了: @csrf_exempt def display_text(request): content = retur
我目前正在研究指针,为了进一步理解我正在尝试使用指针将两个数值数组连接成一个。代码如下所示。 #include void concat(int **pa,int **pb,int **pc) {
我是一名优秀的程序员,十分优秀!