如何在Haskell中实现所有图形和Web库?

Mai*_*r00 5 monads haskell functional-programming hackage

我才开始学习Haskell.我读过它是一种纯函数式语言,其中的所有内容都是不可变的.因此输入输出,写入和读取数据库之类的东西会导致状态的可变性.我知道Haskell中有一个名为monads的东西允许在Haskell中使用命令式功能IO Monad.但我很有意思的是Haskell的一切必要性是在monads的帮助下实现的吗?在HackageDB上有很多软件包可以使用3d图形,数据库,解析HTML,编写Web服务器等等.

这一切背后的一般理念是什么?是什么让Haskell保持纯粹并同时适用于写这一切?我希望有人能为我说清楚.提前致谢!

Nik*_*kov 12

我使用以下类比来理解这些内容,我将用JavaScript表达.

如何表达副作用计算?

1.一个功能

这显然是首先想到的事情:

var launchRockets = function () {
  prepareRockets( queryDBForPreparationParameters() )
  launchAllPreparedRockets()
  outputResults()
}
Run Code Online (Sandbox Code Playgroud)

你可以看到一个有效的函数调用一堆其他有效的函数,这些函数本身可以产生未知的效果,带来所有后续的后果.

2.说明

表达这种情况的另一种方式是组成一组指令,描述某些函数的有效计算以便稍后执行.(曾经组成过SQL查询吗?)

var launchRocketsInstructions = [
  {
    description: "Prepare rockets",
    parameters: {
      description: "Query a DB for preparation parameters"
    }
  },
  {
    description: "Launch all prepared rockets"
  },
  {
    description: "Output results"
  }
]
Run Code Online (Sandbox Code Playgroud)

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

当然,为了实际执行这些指令,人们最终必须逃离到副作用的狂野世界.在JavaScript的情况下,就像execute(launchRocketsInstructions)Haskell 一样,它是运行时执行指令树根的运行时,它是main使用主模块的功能生成的,它将成为程序的单个入口点.因此,Haskell中的副作用实际上发生在语言范围之外,这就是为什么它是纯粹的.


Don*_*art 8

我读过它是一种纯函数式语言,其中的所有内容都是不可变的.

Haskell只是纯/默认/.如果您向编译器声明(通过monadic类型)您希望具有某些效果,则启用它们.

它们默认情况下不会打开.