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

Arrays Haskell:Haskell中的所有名称都是不可变的?数组和列表之间没有区别吗?,arrays,list,haskell,immutability,mutable,Arrays,List,Haskell,Immutability,Mutable,我有两个问题: 在scala或F#等FP语言中,有一些关键字可以识别变量是否可变。当我们说Haskell是一种纯FP语言时,一切都是“不变的” 基于jvm的Scala和基于.net的F#都区分了“数组”和“列表”。Haskell告诉我们的是不同的,还是Haskell中的每个容器都是一个“列表”或“元组” “纯度”不是一个严格定义的概念。在Haskell中,它通常意味着函数没有副作用。但“副作用”也没有严格的定义。Haskell的类型系统允许我们区分纯函数a->b和不纯动作IO a。并非所有内容都

我有两个问题:

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

  • 基于jvm的Scala和基于.net的F#都区分了“数组”和“列表”。Haskell告诉我们的是不同的,还是Haskell中的每个容器都是一个“列表”或“元组”

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

    Haskell也有数组,有几种不同版本的数组,但它们存在于需要导入的模块中

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

    Haskell也有数组,有几种不同版本的数组,但它们存在于需要导入的模块中

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

    突变物质被认为是一种副作用,在哈斯克尔,这种副作用是通过单子控制的。如果函数的类型签名没有提到
    IO
    ,则不能执行任何I/O操作。这包括对其他线程可以看到的内存数据进行变异。(但有趣的是,它不包括仅对此函数可见的变异数据。因此,只要没有外部可见的影响,就可以在纯函数内部进行变异。)

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

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

    突变物质被认为是一种副作用,在哈斯克尔,这种副作用是通过单子控制的。如果函数的类型签名没有提到
    IO
    ,则不能执行任何I/O操作。这包括对其他线程可以看到的内存数据进行变异。(但有趣的是,它不包括仅对此函数可见的变异数据。因此,只要没有外部可见的影响,就可以在纯函数内部进行变异。)


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

    Haskell将变异形式化为IO(因为它就是这样)。例如,提供可变引用,并提供可变数组。还有一些状态线程(
    ST
    )提供本地可变数组。Haskell将突变形式化为IO(因为它就是这样)。例如,提供可变引用,并提供可变数组。还有一些状态线程(
    ST
    )提供本地可变数组。我认为Haskell中的所有内容都是不可变的
    IO a
    只是Haskell程序可以产生的一种类型,它被解释(在Haskell本身之外)为命令式程序。@dfeuer:您能详细说明这个参数吗?定义“Haskell”的意义是什么,这样你就不能执行或评估任何东西了?部分意义在于,你可以在Haskell中使用IO进行纯计算,而不是执行它们。它们是第一类值,当您只是构建它们并传递它们时,所有关于纯Haskell代码的常规规则都适用(特别是当您将monad泛型函数应用于IO操作时)。只有
    main
    的执行是不同的,不难看出这是“外部的”,因为Haskell中没有任何语言设施可以真正谈论它(除了定义
    main
    )。@DietrichEpp,Conal Elliott和其他人似乎认为区分纯语言和附加在其上的任何交互概念是非常重要的。FRP旨在以与
    IO截然不同的方式模拟交互作用