Haskell(以及其他功能语言)一直困扰我的一件事是,整个语言是纯净的,但是通过使用代表整个“现实世界”(IO)的对象,间接允许产生副作用。例如monad)。
我想知道,是否有语言能够在不对整个世界建模的情况下进行处理?例如,将网络输入表示为字节数组,该字节数组在读取网络输入时被延迟填充。
IO
“包含”什么。实际上,它包含一种惰性评估的语法树数据结构,该语法树数据结构后来被解释为产生其所描述的副作用,但是该数据结构只有通过更为抽象的IO
类型才会向用户公开。[无论如何,除了@phipsgabler对Haskell以前使用的方法的出色回答之外,如今在人们想要纯FP的地方几乎都使用了某种IO
类型。但是,这是程序抽象的一种低层边缘。在其之上构建了许多抽象。
一个示例是函数式反应式编程,它具有多种变体,但基本上随时间建立事件流。 Elm具有命令/订阅模型。
[此外,库通常会建立对其领域有意义的抽象,例如Web服务通常被建模为使用Request
对象调用并返回IO
对象的Response
的函数。从该函数开始,不需要副作用,再往下走,您的界面就是纯类型,就像一个接受User
对象并为该用户的配置文件返回HTML的函数。
但是在某些时候,无论您将其称为IO
还是Command
或Observable
,所有这些都归结为非常有力的想法,即从实际执行中分离出想要的副作用的规格这些效果。形式可能有所不同,但基本概念不会很快消失。
IO
(monad)之前所描述的内容类似的名称,名称为[[dialogs