我最近决定潜入函数式编程世界,一位朋友告诉我关于Haskell的事。我开始自己研究语言的特殊性,很快我就得到了主要的概念。然后,我开始使用列表并决定重写一些现有的函数,只是为了练习。
我制作了reverse
函数的版本,并将其命名为revert
。该功能定义如下:
revert :: [a] -> [a]
revert [] = []
revert a = revert (tail a) ++ [head a]
正如你在图片中看到的那样,它对我来说非常有效:
然后,我决定进行另一项测试,在我作为参数传递的同一变量上接收revert
函数的结果,如下所示:
似乎正常执行该函数,但是当我检查x
的值时,它看起来像是进入循环,我需要中断操作。
如果我将值设置在另一个变量上,它可以完美地运行:
let y = revert x
为什么会这样?我缺少一些函数式编程的概念吗?还是Haskell的一些特点?我做了一些谷歌搜索,但无法得到答案
PS:抱歉英文不好
答案 0 :(得分:7)
您正在定义
x = revert x
所以,在右边代替,这就是
x = revert (revert x)
等等。另一个例子是
a = a + 1
要了解a
是什么,我们需要评估定义的右侧。
a = (a + 1) + 1
a = ((a+1)+1) + 1
等等。
引导线:Haskell的=
与C#等语言中的=
非常不同,这意味着赋值。在Haskell中,它意味着被定义为,这意味着我们可以用它的定义替换标识符的任何出现而不改变程序的含义。这称为参照透明度。