代码之家  ›  专栏  ›  技术社区  ›  cjs

Haskell有变量吗?

  •  29
  • cjs  · 技术社区  · 17 年前

    this answer 声称它没有,并且至少九次投票通过并被接受。

    那么它是否有变量,为什么?

    这个问题似乎也适用于ML、F#、OCaml、Erlang、Oz、Lava等等 SSA 中间语言。

    5 回复  |  直到 9 年前
        1
  •  57
  •   Joe the Person    7 年前

    默认情况下,Haskell具有不可变变量(数学意义上的变量):

     foo x y = x + y * 2
    

    默认情况下,变量不是 可变细胞

    Haskell也有可变单元格,但您可以显式启用它们:

     > import Data.IORef (newIORef, readIORef, writeIORef)
     > v <- newIORef 0
     > readIORef v
     0
    
     > writeIORef v 7
     > readIORef v
     7
    

    所以 Haskell有真变量。但默认情况下,它不使用可变变量。

        2
  •  10
  •   Charles Duffy    17 年前

    Section 3.2 of the Haskell Report . 变量可以出现在模式中,因此可以使用如下结构绑定到值 let , case ,并列出理解。

    您的问题中隐含的可能是,如果变量是不可变的,那么它是否正确地称为变量。我认为其他答案充分涵盖了易变性。

        3
  •  9
  •   cjs    17 年前

    是的,Haskell有变量。考虑(本质上等价的)定义

    inc n = n + 1
    inc = \n -> n + 1
    

    在这两种情况下, n 是一个变量;它将在不同的时间呈现不同的值。这个 Haskell Report Section 3 将这些显式地称为变量。

    那个 N 这里有一个变量,如果我们考虑以下完整的程序,可以更容易看到:

    inc n = n + 1
    f = inc 0
    g = inc 1
    main = print (f+g)
    

    答案当然是“3”。评估时 f ,随着我们的扩张 inc x 将承担价值 0 ,以及稍后(或更早!)评估的时间 g ,随着我们的扩张 股份有限公司 x 将承担价值 1 .

    可能会出现一些混淆,因为Haskell与问题中列出的其他语言一样,是一种单一的赋值语言:它不允许在一个范围内重新赋值变量。一旦 N 已指定该值 42 N (这是一个不同的变量,隐藏着另一个变量。) N )绑定到另一个值。

    在某些上下文中,例如使用 do :

     do let n = 1
        print n
        let n = 2
        print n
    

    但是如果你去掉了语法上的糖分,把它翻译成Haskell而不需要 ,很明显,创建了一个新的嵌套范围,其中 N 在该内部作用域中,是一个不同的变量,它对 N 在外部范围内:

    (let n = 1 
      in (print n >> (let n = 2
                       in print n)))
    
        4
  •  4
  •   cjs    17 年前

    http://en.wikipedia.org/wiki/Variable_(programming)) ,是的,Haskell有变量:

    在计算机编程中,变量是一个标识符(通常是字母或单词),它与存储在系统内存中的值或可计算的表达式相链接。例如,一个变量可能被称为“total_count”并包含一个数字。
    在命令式编程语言中,通常可以随时访问或更改值。然而,在纯函数和逻辑语言中,由于引用透明性的要求,变量被绑定到表达式并在其整个生命周期中保持一个值。在命令式语言中,相同的行为表现为常量,这通常与普通变量形成对比。

    当然,并非所有维基百科的定义都是完全可信的。

    关于[数学变量]的页面( http://en.wikipedia.org/wiki/Variable_(mathematics)) 可能会进一步深入了解这一点。

        5
  •  2
  •   Matthew Flaschen    17 年前

    “我听说Haskell没有变量。这是真的吗?”

    No .

    “那么它是否有变量,为什么?”

    Yes.

    编辑2:再次编辑,因为OP更改了问题。