Haskell:Haskell中的所有名字都是不可变的?数组和列表之间没有区别



>我有两个问题:

  1. 在 scala 或 F# 等 FP 语言中,有一些关键字可以识别变量是否可变。当我们说Haskell是一种纯粹的FP语言时,一切都是"不可变的"?

  2. 基于jvm的Scala,基于.net的F#,都区分了"Array"和"List"。Haskell是否对此有不同的看法,或者Haskell中的每个容器都是一个"列表"或"元组"?

在 Haskell 中,所有变量都是不可变的。但是,有各种特殊的数据结构支持突变。首先,您可以在 Haskell 中读取和写入文件,并且可以将文件视为一个巨大的可变变量。当然,Haskell也支持内存中可变结构(IORefSTRefMVarTVar等(。因此(例如(变量x始终指向同一个IORef对象,但可以更改该对象的内容。

突变的东西被认为是一种副作用,在Haskell中是通过monads控制的。如果函数的类型签名未提及IO,则无法执行任何 I/O 操作。这包括改变其他线程可以看到的内存中数据。(但是,有趣的是,不包括仅对此函数可见的突变数据。所以你可以在纯函数内部进行突变,只要没有外部可见的影响。

Haskell"默认为"不可变的单链表,但也支持不可变和可变数组。修改不可变数组需要复制整个数组,将更新转换为 O(n( 操作,从而破坏数组的关键优势。不可变数组仍然是常量数据的绝佳查找表,但大多数基于数组的算法都需要可变数组,这就是为什么也提供这些数组的原因。

">

纯度"不是一个严格定义的概念。在 Haskell 中,它通常意味着函数没有副作用。但"副作用"也没有真正严格的定义。Haskell的类型系统允许我们区分纯函数a -> bIO a的不纯动作。并非所有内容都是不可变的,因为您可以使用 IO 操作来更改IORef的内容,例如。

Haskell也有数组,它们的几个不同版本,但它们可以在你必须导入的模块中找到。

最新更新