在功能编程方面触及Monads之后,该功能是否实际上使语言变得纯粹,或者它是否只是另一个"从监狱免费卡中获取"来推理现实世界中的计算机系统,在黑板数学之外?
编辑:
这不是有人在这篇文章中所说过的火焰诱饵,而是一个真正的问题,我希望有人可以用枪击我说,证明,这是纯粹的.
此外,我正在研究关于其他不那么纯粹的功能语言和一些使用良好设计和比较纯度的OO语言的问题.到目前为止,在我非常有限的FP世界中,我仍然没有理解Monads的纯度,你会很高兴地知道我喜欢不变性的想法,这在纯度赌注中更为重要.
monads haskell functional-programming referential-transparency
我看到Haskell有一个名为"delay"的睡眠函数:Control.Concurrent.Thread.Delay
我的问题是:如果Haskell 纯粹是功能性的,怎么可能有这样的事情呢?睡觉不是附带效果还是我错过了什么?
我一直试图将功能编程包围一段时间?我已经查找了lambda演算,LISP,OCML,F#甚至组合逻辑,但我遇到的主要问题是你如何做需要副作用的事情(与用户交互,与远程服务通信,甚至处理模拟使用)随机抽样)不违反纯函数式编程的基本前提,即对于给定的输入,输出是确定性的?我希望我有意义,如果不是,我欢迎任何正确教育我的尝试.提前致谢.
我正在尝试在Haskell中编写一个交互式,实时的音频合成内容,而我迫切需要"懒惰的数字"来表示时间.
事情就是这样:我的程序基于"信号"的概念,这些信号由"信号处理器"转换.但与Faust或ChucK等其他类似项目不同,我希望使用严格纯粹的功能,并且能够明确地获取时间.
我们的想法是,可以在Haksell中表达纯粹的"懒惰流处理器",并且由于懒惰的评估,它将以交互式,实时的方式工作.
例如,我可以将"midi信号"表示为音符变化事件流:
type Signal = [ (Time, Notes->Notes) ]
Run Code Online (Sandbox Code Playgroud)
这一切在非交互模式下都能很好地工作,但是当我想实时玩它时,我遇到了一个很大的障碍:在任何一个时间点,输出信号都取决于下一次输入的时间事件.所以我的合成引擎实际上会停止直到下一个事件.
让我解释一下:当我的声卡要求输出信号的样本时,懒惰的评估器遍历我的信号处理器的依赖图,并最终要求输入一个输入(midi)信号.但是,让我们说输入信号在本地看起来像这样:
input :: Signal
input = [ ..., (1, noteOn 42), (2, noteOff 42), ... ]
Run Code Online (Sandbox Code Playgroud)
当我需要在1.5时计算输出(音频)信号时,我需要这样的东西:
notesAt :: Signal -> Time -> Notes
notesAt = notesAt' noNotes where
notesAt' n ((st,sf):ss) t
| st > t = n
| otherwise = notesAt' (sf n) ss t
Run Code Online (Sandbox Code Playgroud)
...当我评估"notesAt input 1.5"时,它必须在返回之前计算"2> 1.5".但事件(2,NoteOff 42)将不会再发生0.5秒!所以我的输出依赖于将来会发生的输入事件,从而停止.
我把这种效应称为"矛盾的因果关系".
我已经考虑过如何处理这个问题很长一段时间了,我得出结论,我需要的是某种形式的数字,这将允许我懒洋洋地评估"a> b".让我们说:
bar :: LazyNumber
bar = 1 + bar
foo …Run Code Online (Sandbox Code Playgroud) 我遇到了与Haskell Random generator相关的问题.在大学里,我必须一直处理Java,所以现在我已经腐败了.我正在Haskell开发一款游戏,现在我面临的是"有机会做某事",这种机会需要像Int -> Bool.在Java中,我会做到的
new Random().nextInt(100)
Run Code Online (Sandbox Code Playgroud)
问题解决了!在Haskell中,我必须在monad IO中选择一些东西或者使用种子.这些都不是我想要的.我真的不想在我的纯模型中使用IO monad,种子很难用,因为我每次都需要记住我的新种子......
有没有简单的像Java的随机?
问题不是什么IO,而是如何定义,它的签名.具体来说,这个数据或类是" a"它的类型参数呢?我没找到任何地方.另外,我不明白这个的句法意义:
f :: IO a
Run Code Online (Sandbox Code Playgroud)