它从文件加载时有效,但在输入ghci时则无效。为什么?

时间:2013-10-06 15:43:49

标签: haskell ghci

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

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

2 个答案:

答案 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的先前定义。