Если я помещу следующие 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.
потом не возвращается. Почему?
Если я помещу следующие 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.
потом не возвращается. Почему?
Последняя привязка переопределяет первую. Используйте это в 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
Вы должны ввести все это в одну строку или использовать :{ и :} для ввода нескольких строк:
> 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.
:set +m/:unset +m; после let, если вы сделаете отступ на четыре пробела (для выравнивания) в следующей строке, вы можете продолжить определение в том же блоке let.
- person Antal Spector-Zabusky; 06.10.2013