Он работает при загрузке из файла, но не при вводе в ghci. Почему?

Если я помещу следующие 2 строки в 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.

потом не возвращается. Почему?


person user1358    schedule 06.10.2013    source источник


Ответы (2)


Последняя привязка переопределяет первую. Используйте это в 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
person Roman Cheplyaka    schedule 06.10.2013

Вы должны ввести все это в одну строку или использовать :{ и :} для ввода нескольких строк:

> let { f 1 = 1; f x = f (x - 1) }

Or

> :{
>   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.

person bheklilr    schedule 06.10.2013
comment
Есть также многострочный синтаксис GHCi, переключаемый с помощью :set +m/:unset +m; после let, если вы сделаете отступ на четыре пробела (для выравнивания) в следующей строке, вы можете продолжить определение в том же блоке let. - person Antal Spector-Zabusky; 06.10.2013