我记得去年学过的haskell编程,突然间我遇到了一个小问题。
ghci> let test = [1,2,3,4]
ghci> test = drop 1 test
ghci> test
^CInterrupted.
我不记得是否有可能。 谢谢!
答案 0 :(得分:9)
test
和第二行上的test
不是 ,实际上是相同的变量。它们是两个不同的,独立的,不相关的变量,它们恰好具有相同的名称。
此外,“保存变量”的概念不适用于Haskell。在Haskell中,变量不能解释为可以保存值的“内存单元”。 Haskell的变量更像是数学变量-只是为了简化推理而为复杂表达式指定的名称(好吧,这有点过分简化,但到目前为止已经足够了)
因此,Haskell中的变量是不可变。您不能像其他许多语言一样通过赋值来更改变量的值。如上所述,该属性来自于从数学意义上解释“变量”的概念。
此外,Haskell中的定义(也称为“绑定”)是递归。这意味着装订的右侧(主体)可以指代其左侧。这对于构造无限数据结构非常方便,例如:
x = 42 : x
42
个无限列表
在您的示例中,当您编写test = drop 1 test
时,您正在定义一个名为test
的列表,该列表与上一行中定义的列表完全无关,并且等于本身没有第一个元素。尝试打印这样的列表会导致无限循环是很自然的。
最重要的是:您无法做自己想做的事情。您不能创建新的绑定,该绑定会遮盖现有的绑定,同时引用它。只需给它起一个不同的名字即可。