【发布时间】:2009-04-27 21:39:49
【问题描述】:
我对 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, ...-
等等...它只是永远重复,这是因为它使用了 lazy 评估吗?
-- 编辑--
好的,所以让 order_list = CashOnDelivery:order_list 不会将 CashOnDelivery 添加到原始 order_list 然后将结果设置为 order_list,而是递归并创建一个无限列表,永远添加 CashOnDelivery到自己的开始。当然,现在我记得 Haskell 是一种函数式语言,我无法更改原始 order_list 的值,那么对于简单的“将其添加到此列表的末尾(或开头,无论如何)我该怎么办?” 制作一个以列表和 BillingInfo 作为参数的函数,然后返回一个列表?
-- 编辑 2--
好吧,基于我得到的所有答案以及无法通过引用和变异变量传递对象(例如我习惯的)......我想我刚刚问了这个问题过早地,我真的需要进一步研究功能范式,然后才能真正理解我的问题的答案......我想我一直在寻找的是如何编写一个函数或其他东西,获取一个列表和一个项目, 并返回一个同名列表,这样函数就可以被多次调用,而无需每次都更改名称(就好像它实际上是一个将实际订单添加到订单列表的程序,而用户不会每次都为列表考虑一个新名称,而是将一个项目附加到同一个列表中)。
【问题讨论】:
-
您将始终创建一个新列表。为什么要使用旧名称来指代新列表?
-
在你能理解答案之前,你必须先理解你的问题。
标签: haskell functional-programming operators