文本文件数据库:第2部分

2010年10月22日

处理函数比上一次练习; 他们不必处理多个行尾标记或可选参数。这里是折叠:

(定义(fold-port读取器文件夹base.port)
(let((p(if(null?端口)(当前输入端口)(汽车端口)))
(let循环((项目(读取器p))(结果库))
(if(eof-object?item)
结果
(循环(读卡器p)(文件夹结果项))))

映射端口可以写成(反向(fold-port reader cons'())。端口)),但我们会让它独立存在:

(定义(map-port读取器mapper.port)
(let((p(if(null?端口)(当前输入端口)(汽车端口)))
(let循环((项(读取器p))(结果'()))
(if(eof-object?item)
(结果相反)
(循环(读取器p)(cons(映射项)结果))))

For-each执行与fold和map相同的迭代,但不累加输出,因为所有过程调用都只针对其副作用进行评估:

(定义(用于每个端口的读取器进程端口)
(let((p(if(null?端口)(当前输入端口)(汽车端口)))
(let循环((项目(读取器p)))
(如果(不是(eof-object?item))
(开始(进程项)(循环(读取器p))))

过滤器不同于其他过滤器,采用读取器并返回新的读取器:

(定义(过滤器端口读取器pred?)
(lambda参数
(let循环((x(应用读取器参数)))
(cond((eof对象?x)x)
((预?x)x)
(其他(循环(应用读取器参数))))

上述代码收集于http://programmingpraxis.codepad.org/c7utWH0v,在下一个练习中,我们将有一个真实的例子。您可以在中阅读有关这种类型的输入/输出数据处理的更多信息这篇论文,包括文档、示例用法和完整代码。

页码:1 2

2对“文本文件数据库:第2部分”的回应

  1. […]实践–文本文件数据库:第2部分Remco Niemeijer在今天的编程实践练习中,我们的任务是定义在[…]上映射、过滤、折叠和转发的函数

  2. 雷姆科·尼梅耶

    当我在争论时http://bonsaicode.wordpress.com/2010/10/22/programming-praxis-text-file-databases-part-2/这四个值得在Haskell中实现的选项中,只有foreach一个,因为将其他选项限制在文本数据库中会损失更多的便利。因此,下面的代码示例仅显示foreach(也称为mapM_)的定义以及如何将常规列表处理函数应用于数据库记录。

    dbMapM_::Monad m=>(a->m b)->要么l[a]->m()dbMapM_=其中之一(const$return())。地图M_主::IO()main=do数据库<-readDB(fixedLength[5,3,4])“db_fl.txt”打印$map头<$>db打印$foldl(const.suck)0<$>db打印$filter(奇数长度)<$>dbdbMapM_打印数据库

留下评论