Я действительно новичок в Haskell (на самом деле я видел «Real World Haskell» от O'Reilly и подумал: «Хм, я думаю, что вчера изучу функциональное программирование»), и мне интересно: я могу использовать оператор конструкции для добавления элемента в начало списка:
1 : [2,3]
[1,2,3]
Я попытался создать пример типа данных, который нашел в книге, а затем поэкспериментировал с ним:
--in a file
data BillingInfo = CreditCard Int String String
| CashOnDelivery
| Invoice Int
deriving (Show)
--in ghci
$ let order_list = [Invoice 2345]
$ order_list
[Invoice 2345]
$ let order_list = CashOnDelivery : order_list
$ order_list
[CashOnDelivery, CashOnDelivery, CashOnDelivery, CashOnDelivery, CashOnDelivery, CashOnDelivery, CashOnDelivery, CashOnDelivery, CashOnDelivery, CashOnDelivery, CashOnDelivery, CashOnDelivery, CashOnDelivery, CashOnDelivery, ...-
и т.д... он просто повторяется вечно, потому что он использует ленивую оценку?
-- ИЗМЕНИТЬ --
ладно, так что мне в голову вбивается, что let order_list = CashOnDelivery:order_list не добавляет CashOnDelivery в исходный список order_list, а затем устанавливает результат в order_list, а вместо этого является рекурсивным и создает бесконечный список, навсегда добавляя CashOnDelivery в начало себя. Конечно, теперь я вспомнил, что Haskell — это функциональный язык, и я не могу изменить значение исходного списка order_list, так что же мне делать для простого «прикрепить это к концу (или началу, как угодно) этого списка?» Сделать функцию, которая принимает список и BillingInfo в качестве аргументов, а затем возвращает список?
-- ИЗМЕНИТЬ 2 --
ну, основываясь на всех ответах, которые я получаю, и на отсутствии возможности передавать объект по ссылке и изменять переменные (например, к которым я привык)... Я думаю, что я только что задал этот вопрос преждевременно и что Мне действительно нужно углубиться в функциональную парадигму, прежде чем я смогу действительно понять ответы на свои вопросы... Я думаю, что я искал, как написать функцию или что-то в этом роде, взяв список и элемент и вернув список под одним и тем же именем, чтобы функцию можно было вызывать более одного раза, не меняя каждый раз имя (как если бы это была программа, которая добавляла бы фактические заказы в список заказов, и пользователю не нужно было бы думать о каждый раз новое имя для списка, а добавлять элемент в тот же список).