保存将函数应用于同一变量中的变量的结果

时间:2019-09-15 21:16:08

标签: haskell

我记得去年学过的haskell编程,突然间我遇到了一个小问题。

ghci> let test = [1,2,3,4]
ghci> test = drop 1 test
ghci> test



^CInterrupted.

我不记得是否有可能。 谢谢!

1 个答案:

答案 0 :(得分:9)

第一行上的

test和第二行上的test不是 ,实际上是相同的变量。它们是两个不同的,独立的,不相关的变量,它们恰好具有相同的名称。

此外,“保存变量”的概念不适用于Haskell。在Haskell中,变量不能解释为可以保存值的“内存单元”。 Haskell的变量更像是数学变量-只是为了简化推理而为复杂表达式指定的名称(好吧,这有点过分简化,但到目前为止已经足够了)

因此,Haskell中的变量是不可变。您不能像其他许多语言一样通过赋值来更改变量的值。如上所述,该属性来自于从数学意义上解释“变量”的概念。

此外,Haskell中的定义(也称为“绑定”)是递归。这意味着装订的右侧(主体)可以指代其左侧。这对于构造无限数据结构非常方便,例如:

x = 42 : x

42个无限列表

在您的示例中,当您编写test = drop 1 test时,您正在定义一个名为test的列表,该列表与上一行中定义的列表完全无关,并且等于本身没有第一个元素。尝试打印这样的列表会导致无限循环是很自然的。

最重要的是:您无法做自己想做的事情。您不能创建新的绑定,该绑定会遮盖现有的绑定,同时引用它。只需给它起一个不同的名字即可。