У вас, похоже, есть фундаментальное недопонимание относительно списков в Haskell. Списки всегда неизменны, поэтому невозможно добавить новые элементы в существующий список. То есть Вы можете создавать только новые списки.
Таким образом, соответственно, оператор a:b
никогда не добавляет элемент в список, а создает новый список, где a
- первый элемент, за которым следует существующий список b
.
Когда вы говорите:
let xs = 2 : xs
Вы говорите, что xs
- это список, в котором первый элемент равен 2
, а остальная часть списка - это xs
, что логически приводит к бесконечному списку из 2. В контексте этого вопроса не имеет значения, находитесь ли вы в монаде IO или нет.
Итак, учитывая вышесказанное, вам нужно сделать что-то вроде
let xs1 = [1]
let xs2 = 2:xs1
let xs3 = 3:xs2
Но, конечно, это то же самое, что просто сделать
let xs3 = [3,2,1]
Так что вам действительно нужно дать больше контекста о том, какой список вы хотите создать и почему.