如果我将以下两行放入 foobar.hs
f 1 = 1
f x = f (x-1)
然后
$ ghci
> :load foobar.hs
> f 5
1
但如果我这样做
$ ghci
> let f 1 = 1
> let f x = f (x-1)
> f 5
^CInterrupted.
然后它不会返回。为什么?
后者绑定覆盖前者。在 ghci 中使用它:
Prelude> :{
Prelude| let f 1 = 1
Prelude| f x = f (x-1)
Prelude| :}
Prelude> f 5
1
或者,没有布局:
Prelude> let f 1 = 1; f x = f (x-1)
Prelude> f 5
1
您必须在一行中全部输入,或者使用:{
and:}
输入多行:
> let { f 1 = 1; f x = f (x - 1) }
或者
> :{
> let f 1 = 1
> f x = f (x - 1)
> :}
当您使用两个let
语句来定义f
时,您实际上是在重新定义f
第二次,而不是添加到它的定义中。如果你要做
> let x = 1
> let x = 5
那么,x
将是 5,而不是 1。函数也是如此。首先,您定义f
为f 1 = 1
。接下来,您定义f
as f x = f (x - 1)
,它会覆盖之前对 的定义f
。