gpt4 book ai didi

haskell - Haskell 中的所有图形和网络库是如何实现的?

转载 作者:行者123 更新时间:2023-12-04 16:22:19 25 4
gpt4 key购买 nike

我才开始学习 Haskell。我读过它是一种纯函数式语言,其中的所有内容都是不可变的。因此,诸如输入输出、写入和读取数据库之类的事情会导致状态的可变性。我知道 Haskell 中有一个叫做 monads 的东西,它允许在 Haskell 中使用命令式特性,例如 IO Monad .但我很有趣的是,Haskell 中所有必要的事情都是在 monad 的帮助下实现的吗?在 HackageDB 上有很多包可以处理 3d 图形、数据库、解析 HTML、编写 Web 服务器等等。
这一切背后的总体思路是什么?是什么让 Haskell 保持纯粹并同时适用于编写所有这些?我希望有人会为我澄清这一点。提前致谢!

最佳答案

我通过下面的类比来理解这些东西,我将用 JavaScript 来表达。

如何表达一个有副作用的计算?

1.一个函数

这显然是首先想到的:

var launchRockets = function () {
prepareRockets( queryDBForPreparationParameters() )
launchAllPreparedRockets()
outputResults()
}

你可以看到一个有效的函数调用了一堆其他有效的函数,这些函数本身可以产生未知的效果以及随之而来的所有后果。

2. 使用说明

表达这一点的另一种方式是编写一组指令,描述这些有效的计算,以便稍后执行某些函数。 (曾经编写过 SQL 查询吗?)
var launchRocketsInstructions = [
{
description: "Prepare rockets",
parameters: {
description: "Query a DB for preparation parameters"
}
},
{
description: "Launch all prepared rockets"
},
{
description: "Output results"
}
]

那么我们在第二个例子中看到了什么?我们看到一个不可变的数据树来描述计算而不是立即执行它。这里没有副作用,为了组成这个数据树,我们当然可以使用纯函数。这就是 Haskell 中副作用的本质所在。该语言提供的所有基础设施:单子(monad)、 IO , do -notation - 这些只是工具和抽象,可简化您编写单个指令树的任务。

当然,要真正执行这些指令,最终将不得不逃入副作用的狂野世界。如果是 JavaScript,它将类似于 execute(launchRocketsInstructions) ,在 Haskell 的情况下,它是执行您使用函数 main 生成的指令树的根的运行时。主模块,它成为程序的单一入口点。因此,Haskell 的副作用实际上发生在语言范围之外,这就是为什么它是纯粹的。

关于haskell - Haskell 中的所有图形和网络库是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15834966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com