首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在haskell增加一份名单

在haskell增加一份名单
EN

Stack Overflow用户
提问于 2015-05-06 20:45:17
回答 1查看 453关注 0票数 0

我正在学习Haskell,通过编写一个OSC音乐排序器来将它与SuperCollider一起使用。但是因为我想用它做一些相当复杂的事情,它的工作方式就像一种编程语言,可以声明变量和定义函数,这样就可以以算法的方式编写音乐。语法是不寻常的,因为我们在编码序列,有时条形图会引用最后一个小节(类似于“再弹最后一个和弦,但上面五分之一”)。我对我自己的解释并不满意,但这是我所能做到的最好的,而不是过于技术性的。

无论如何,我现在正在编写的是该语言的解析器,到目前为止是无状态的,但是现在我需要一些方法来实现越来越多的声明变量和类似的列表,使用[("key","value")]方式的字典,这样我就可以在逐条解析时添加新的值。我知道这涉及到单子,我还不太明白,但我需要一些有意义的东西来开始玩弄它们,否则我觉得原始理论太粗糙了。

那么,什么是一个干净而简单的开始方式呢?如果问题太长,谢谢和抱歉。

编辑事物是如何工作的:

  • 我们向主解析函数输入一个字符串,比如"afunction(3) ; anotherone(1) + [3,2,1]"
  • 我们首先标识闭包,然后识别各种字符(字母、名词等)并将它们组合在一起,因此我们得到了如下列表:[("word","afunction"),("parenth","(3)"),("space"," "),("semicolon",";"),("space"," "),("word","anotherone"),("parenth","(1)"),("space"," "),("opadd","+"),("space"," "),("bracket","[3,2,1]")]
  • 然后,我们使用一个函数,用它们所占用的原始字符串的索引标记所有这些元组,例如:[("word","afunction",(0,8)),("parenth","(3)",(9,11)),("space"," ",(12,13)) ...]
  • 然后把它切成条形,在我的语言中用分号分隔,然后用逗号在注释中分开。

现在,我正处于应该按顺序执行这些函数的阶段,但是由于其中一些函数正在读取或修改以前声明的值,我需要跟踪这些更改。例如,假设函数f(x)移动x半音的最后一个音符的音调,所以

代码语言:javascript
运行
复制
f(9), -- from an original base value of 0 (say that's an A440) we go to 9
f(-2), -- 9-2 = 7, so a fifth from A
f(-3); -- 9-2-3, a minor third down from the last value.

但有时候事情会变得更复杂,别让我解释,因为我会把你烦死的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-06 21:12:00

向列表中添加项

您可以使用:构造函数创建一个比现有列表多一个项的新列表。

代码语言:javascript
运行
复制
("key", "value") : existing

其中existing是您已经列出的列表

跟踪状态的变化

您可以通过将状态从每个函数传递到下一个函数来跟踪函数之间的状态更改。这就是State monad所做的一切。State s aa类型的值,它依赖于(并更改)状态s

代码语言:javascript
运行
复制
{-         ┌---- type of the state
           v v-- type of the value                 -}
data State s a = State { runState :: s -> (a, s) }
{-                                   ^  ^  ^  ^
      a function                  ---|--┘  |  |
      that takes a state          ---┘     |  |
      and returns                          |  |
      a value that depends on the state ---┘  |
      and a new state                   ------┘    -}

用于>>=的绑定操作State接受一个依赖(并改变)状态的值和一个函数来计算另一个依赖(和更改)状态的值,并将它们组合成一个依赖(并更改)状态的新值。

代码语言:javascript
运行
复制
m >>= k = State $ \s ->
              let ~(a, s') = runState m s
              in runState (k a) s'
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30087198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档