如果我将以下两行放入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.
然后它不会返回。为什么呢?
答案 0 :(得分:5)
后者的绑定优先于前者。在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
答案 1 :(得分:3)
您必须在一行中输入所有内容,或使用:{
和:}
输入多行:
> 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
定义为f x = f (x - 1)
,它会覆盖f
的先前定义。