Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

It works when loaded from file, but not when typed into ghci. Why?

Tags:

haskell

ghci

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?

like image 481
user1358 Avatar asked Oct 06 '13 15:10

user1358


2 Answers

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
like image 129
Roman Cheplyaka Avatar answered Oct 23 '22 15:10

Roman Cheplyaka


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.

like image 20
bheklilr Avatar answered Oct 23 '22 15:10

bheklilr