Как и многие новички в Haskell, вы пишете функции в стиле императив , где вы обновляете переменные.
Переменная в Haskell, однако, не может быть обновлена: (пере) не присваиваете значение переменной, вы объявляете переменную. Если вы пишете i = i + 1
, вы не берете старое значение i
и добавляете к нему 1
, здесь вы объявляете i
в терминах самого себя, поэтому i = i + 1
, означает, что мы написали бесконечное глубокое рекурсивное выражение i = ( ( (...) + 1) + 1) + 1
.
В вашей функции вы, кажется, обновляете m
:
addText (<b>m</b>, l, p, _, k) i =
let a = take p <b>m</b>
<b>m</b> = drop p <b>m</b>
full = a++i++<b>m</b>
in (full, length full, p + length i, "", k)
Итак, вы написали m
в терминах самого себя, и хотя из-за лени это не будет per se loop, в случае необходимости значения m
, мы застрянем в бесконечности рекурсии.
Используя новую переменную, мы можем решить проблему:
addText (<b>m</b>, l, p, _, k) i =
let a = take p <b>m</b>
<b>z</b> = drop p <b>m</b>
full = a++i++<b>z</b>
in (full, length full, p + length i, "", k)
То же явление происходит, если вы напишите:
Prelude> t = addText t "test"
вы снова определяете t
в терминах самого себя. Таким образом, вам лучше использовать другую переменную или константы:
Prelude> t = addText ("",0,0,"","") "test"