我正在学习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半音的最后一个音符的音调,所以
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.等
但有时候事情会变得更复杂,别让我解释,因为我会把你烦死的。
发布于 2015-05-06 21:12:00
向列表中添加项
您可以使用:构造函数创建一个比现有列表多一个项的新列表。
("key", "value") : existing其中existing是您已经列出的列表
跟踪状态的变化
您可以通过将状态从每个函数传递到下一个函数来跟踪函数之间的状态更改。这就是State monad所做的一切。State s a是a类型的值,它依赖于(并更改)状态s。
{- ┌---- 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接受一个依赖(并改变)状态的值和一个函数来计算另一个依赖(和更改)状态的值,并将它们组合成一个依赖(并更改)状态的新值。
m >>= k = State $ \s ->
let ~(a, s') = runState m s
in runState (k a) s'https://stackoverflow.com/questions/30087198
复制相似问题