If I put the following 2 lines into foobar.hs
f 1 = 1
f x = f (x-1)
then
$ ghci
> :load foobar.hs
> f 5
1
but if I do
$ ghci
> let f 1 = 1
> let f x = f (x-1)
> f 5
^CInterrupted.
then it does not return. Why?
The latter binding overrides the former. Use this in ghci:
Prelude> :{
Prelude| let f 1 = 1
Prelude| f x = f (x-1)
Prelude| :}
Prelude> f 5
1
Or, without the layout:
Prelude> let f 1 = 1; f x = f (x-1)
Prelude> f 5
1
You have to enter it all in on one line, or using :{
and :}
to enter multiple lines:
> let { f 1 = 1; f x = f (x - 1) }
Or
> :{
> let f 1 = 1
> f x = f (x - 1)
> :}
When you use two let
statements to define f
, you are actually redefining f
the second time, not adding to its definition. If you were to do
> let x = 1
> let x = 5
Then, x
would be 5, not 1. The same goes for functions. First, you define f
as f 1 = 1
. Next, you define f
as f x = f (x - 1)
, which overwrites the previous definition for f
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With