Бесконечный цикл Haskell с простым действием повторного запуска

У меня есть такой код:

Prelude> let n = [1,2,3,4]
Prelude> n
[1,2,3,4]
Prelude> 0:n
[0,1,2,3,4]
Prelude> let n = 0:n

И когда я набираю интерпретатор Haskell после верхнего:

Prelude> n

Я получаю бесконечный результат:

[0,0,0,0,0,0,0,0,0

И где печать «0,» бесконечна.

Почему я получаю такой результат?
Есть ли какие-то рекурсивные вещи, и почему/как это работает на уровне интерпретатора?
Могу ли я отловить переполнение стека, что такое на GHCi или нет?

Спасибо,
С наилучшими пожеланиями!


person Community    schedule 22.03.2012    source источник
comment
n=[0,1,2,3,4] конфликтует с n=n:0 вы не согласны?   -  person PyRulez    schedule 11.11.2013


Ответы (3)


Джош говорит, что ваше определение n расширяется как:

0:n.  -- note n still equals 0:n, just like you said
0:0:n. -- note n _still_ equals 0:n
0:0:0:n
...
person Thomas M. DuBuisson    schedule 22.03.2012

Новая привязка n скрывает старую. Вы не переназначаете переменные в Haskell.

person Josh Lee    schedule 22.03.2012

let в Haskell похож на letrec в других языках, таких как ML: привязки могут быть рекурсивными. Другими словами, n = 0:n определяет n как список, в котором первый элемент равен 0, а остальная часть списка равна n. Это означает, что второй элемент n равен первому элементу n, то есть 0, и т. д.

Бесконечные списки допустимы в Haskell из-за лени. Если вы используете только первые 10 элементов списка, то 11-й элемент и далее никогда не будут оцениваться.

person Dan Burton    schedule 22.03.2012