6

如果我将以下两行放入 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.

然后它不会返回。为什么?

4

2 回答 2

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
于 2013-10-06T15:47:53.360 回答
3

您必须在一行中全部输入,或者使用:{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。函数也是如此。首先,您定义ff 1 = 1。接下来,您定义fas f x = f (x - 1),它会覆盖之前对 的定义f

于 2013-10-06T15:47:02.353 回答