是否有任何语言能够处理功能性杂质(副作用),而无需将其建模为RealWorld或IO?

问题描述 投票:1回答:2

Haskell(以及其他功能语言)一直困扰我的一件事是,整个语言是纯净的,但是通过使用代表整个“现实世界”(IO)的对象,间接允许产生副作用。例如monad)。

我想知道,是否有语言能够在不对整个世界建模的情况下进行处理?例如,将网络输入表示为字节数组,该字节数组在读取网络输入时被延迟填充。

functional-programming side-effects io-monad
2个回答
1
投票
我从没有真正喜欢现实世界的类比。我认为它很流行,因为大多数人最先接触到参数多态性的是容器,因此他们的大脑想知道IO“包含”什么。实际上,它包含一种惰性评估的语法树数据结构,该语法树数据结构后来被解释为产生其所描述的副作用,但是该数据结构只有通过更为抽象的IO类型才会向用户公开。

[无论如何,除了@phipsgabler对Haskell以前使用的方法的出色回答之外,如今在人们想要纯FP的地方几乎都使用了某种IO类型。但是,这是程序抽象的一种低层边缘。在其之上构建了许多抽象。

一个示例是函数式反应式编程,它具有多种变体,但基本上随时间建立事件流。 Elm具有命令/订阅模型。

[此外,库通常会建立对其领域有意义的抽象,例如Web服务通常被建模为使用Request对象调用并返回IO对象的Response的函数。从该函数开始,不需要副作用,再往下走,您的界面就是纯类型,就像一个接受User对象并为该用户的配置文件返回HTML的函数。

但是在某些时候,无论您将其称为IO还是CommandObservable,所有这些都归结为非常有力的想法,即从实际执行中分离出想要的副作用的规格这些效果。形式可能有所不同,但基本概念不会很快消失。


1
投票
Haskell本身被指定使用与您在发明IO(monad)之前所描述的内容类似的名称,名称为[[dialogs
© www.soinside.com 2019 - 2024. All rights reserved.