Car*_*ers 9 haskell functional-programming operators
我对Haskell真的很陌生(实际上我从O'Reilly看到了"Real World Haskell",并且认为"嗯,我想我昨天将学习函数式编程")我想知道:我可以使用构造运算符来添加项目到列表的开头:
1 : [2,3]
[1,2,3]
Run Code Online (Sandbox Code Playgroud)
我尝试制作一本我在书中找到的示例数据类型然后玩它:
--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, ...-
Run Code Online (Sandbox Code Playgroud)
等......它只是永远重复,这是因为它使用了懒惰的评价?
- 编辑 -
好吧,所以我的头脑中有点让order_list = CashOnDelivery:order_list不会将CashOnDelivery添加到原始order_list然后将结果设置为order_list,而是递归并创建一个无限列表,永远将CashOnDelivery添加到开头本身.当然,现在我记得Haskell是一种函数式语言,我无法改变原始order_list的值,所以我应该怎么做才能简单地将这个列表添加到此列表的最后(或者开头,等等)?" 创建一个以列表和BillingInfo为参数的函数,然后返回一个列表?
- 编辑2 -
好吧,基于我得到的所有答案以及缺乏能够通过引用传递对象和变异变量(例如我习惯)...我认为我刚刚过早地问过这个问题而且在我真正理解我的问题的答案之前,我真的需要深入研究功能范例......我想我正在寻找的是如何编写函数或其他东西,获取列表和项目,以及返回同名的列表,因此可以多次调用该函数,而不是每次都更改名称(就好像它实际上是一个将实际订单添加到订单列表的程序,并且用户不必考虑每次列表的新名称,而是将项目附加到同一列表中).
sth*_*sth 14
你做这个:
$ let order_list = [Invoice 2345]
$ let order_list = CashOnDelivery : order_list
Run Code Online (Sandbox Code Playgroud)
这里要注意的重要一点是,您不只是CashOnDelivery在第一个项目中添加项目order_list.您正在定义一个order_list与第一个无关的新变量.这是一个递归定义,order_list右侧是指order_list您在左侧定义的,而不是前一行中定义的定义.由于这种递归,您将获得无限的列表.
我怀疑你真的想做这样的事情:
$ let order_list = [Invoice 2345]
$ order_list
[Invoice 2345]
$ let order_list2 = CashOnDelivery : order_list
$ order_list2
[CashOnDelivery, Invoice 2345]
Run Code Online (Sandbox Code Playgroud)
作为恢复ML程序员,我得到这个抓住所有的时间.这是Haskell中为数不多的烦恼之一,你不能轻易地重新命名一个名字let或where条款.如果要使用let或where,则必须创建新名称.在顶级的read-eval-print循环中,如果要一次绑定一个名称,则别无选择.但是如果你愿意嵌套构造,你可以滥用do标识monad 的符号:
import Control.Monad.Identity
let order_list = runIdentity $ do
order_list <- return [Invoice 2345]
order_list <- return $ CashOnDelivery : order_list
return order_list
Run Code Online (Sandbox Code Playgroud)
是的,这个代码是卑鄙的 - 并且在这个例子中不值得 - 但如果我有一长串的重新绑定,我可能会诉诸它,所以我不必在同一个名字上发明5或6个无意义的变体.
| 归档时间: |
|
| 查看次数: |
14457 次 |
| 最近记录: |