我对 Haskell 真的很陌生(实际上我从 O'Reilly 看到“Real World Haskell”并想“嗯,我想我会在昨天学习函数式编程”)我想知道:我可以使用构造运算符添加一个项目到列表的开头:
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, ...-
等等......它只是永远重复,这是因为它使用了惰性评估吗?
- 编辑 -
好的,所以让 order_list = CashOnDelivery:order_list 不会将 CashOnDelivery 添加到原始 order_list 然后将结果设置为 order_list,而是递归并创建一个无限列表,永远将 CashOnDelivery 添加到开头本身。当然,现在我记得 Haskell 是一种函数式语言,我无法更改原始 order_list 的值,那么对于简单的“将其添加到此列表的末尾(或开头,无论如何)我该怎么办?” 制作一个以列表和 BillingInfo 作为参数的函数,然后返回一个列表?
-- 编辑 2 --
好吧,基于我得到的所有答案以及无法通过引用和变异变量传递对象(例如我习惯的)......我想我只是过早地问了这个问题,而且我真的需要进一步研究函数范式,然后才能真正理解我的问题的答案......我想我正在寻找的是如何编写一个函数或其他东西,获取一个列表和一个项目,然后返回一个同名列表,因此可以多次调用该函数,而无需每次都更改名称(好像它实际上是一个将实际订单添加到订单列表的程序,用户不必考虑每次列表的新名称,而是将一个项目附加到同一个列表中)。