第4周的练习:IO、测试数据和属性
以下是一些练习,旨在帮助您练习使用IO编程,测试数据生成和属性。
如果你没有时间做所有这些练习,不用担心。这些练习旨在提供足够的工作来保持最经验丰富的学生很忙。如果你做了所有标有(*)的练习可能理解了本周的内容。
0 (*). 基本IO
(基于汤普森的问题,第18章)。答:。编写一个IO程序,首先读取正比如说整数n个
,然后读取n个
整数和写入他们的总和。程序应适当提示输入和解释其输出。
B。编写一个重复读取整数的程序(每个行),直到找到零值并输出输入读取。在这种情况下,哪种排序算法最合适案例?
C、。定义函数
重复::IO Bool->IO()->IO()
这样的话重复测试操作
具有以下效果重复操作
直到出现这种情况测试
是真的
.
1 (*). Look函数的属性
考虑以下标准Haskell函数,该函数在成对列表(表)中查找元素:看:等式a=>a->[(a,b)]->也许blook x[]=没有看x((x',y):xys)|x==x'=只有y|否则=look x xys
定义属性prop_LookNothing(prop_LokNothing)
表示如果look函数交付没有什么
,然后我们要找的东西不在桌子上。还定义属性prop_LookJust(查看刚刚)
这表明如果look函数提供结果只是
年,然后是这对(x个,年)应该在桌子上。
同时写入属性推进_查看
结合了prop_LookNothing(prop_LokNothing)
和属性(_J)
进入之内一个属性.
2.Monadic辅助函数
给出以下功能的实现:序列:单子m=>[ma]->m[a]mapM::单峰m=>(a->mb)->[a]->m[a]仅限If::单子m=>Bool->m()->m()
序列
获取产生类型值的指令列表a、 并创建一条执行所有这些操作的大指令,将所有结果收集到一个结果列表中。示例:说明书序列[readFile file | file<-files]mapM readFile文件
两者都读取列表中所有文件的内容文件夹
、和生成每个文件的内容。
仅如果
接受布尔值和指令,并创建仅在布尔值为真的
。如果布尔值为False(错误)
,什么都没发生。例如,
仅当失败时重试
执行指令仅当布尔值失败
是真的
.
提示:您可能会发现更容易想到上述函数的类型:
序列::[IO a]->IO[a]映射M::(a->IO b)->[a]->IO[b]onlyIf::Bool->IO()->IO()
3 (*). 猜数字游戏
在本练习中,您将实现“猜数字游戏”在哈斯克尔。
这是一个如何工作的示例:
主菜单>游戏
想想一个介于1和100之间的数字!是50吗?更高
是75吗?降低
是62吗?降低
是56吗?对
太好了,我赢了!
文本看起来像这样
是用户输入的内容。其他文本由程序生成。实现一个功能
游戏::IO()
这就是这个游戏的一个例子。您可能需要以下功能:
getLine::IO字符串——读取一行用户输入putStrLn::String->IO()——输出一行文本
在开始编程之前,为最小化猜测次数的计算机!4.备份脚本
库模块系统。号码簿
提供了功能用于处理文件和目录。使用这些函数编写一个程序
- 创建一个名为“backup”的新目录,
- 将当前目录中的所有文件复制到备份目录中。
提示:了解哪些功能的一种方法一个包含的模块,因此使用:浏览
GHCi中的命令。
前奏曲>:模块系统。号码簿
前奏曲系统。目录>:浏览
...创建目录::文件路径->IO()doesDirectoryExist::FilePath->IO布尔...
这为您提供了函数的名称和类型,但您可能仍然需要查阅文档以了解如何使用它们。以下是模块文档的链接包含在最新版本的GHC中:
您可能还需要执行所有操作列表。您可以找到该函数序列
练习2中有用的为了这个。
5 (*). 正在生成列表
有时我们想生成一定长度的列表。
答:。编写生成器
listOf::Integer->Gen a->Gen[a]
这样的话列表
n个 克生成的列表n个元素,其中每个元素由生成克.您将拥有什么财产写测试生成器是否正常工作?B。现在使用列表
编写一个生成器来生成相同、随机、长度。
C、。看看标准的Haskell函数拉链
和拉开拉链
:
邮政编码:[a]->[b]->[(a,b)]解压缩::[(a,b)]->([a],[b])
写下这两个属性;就是这样说的拉链
是的倒数拉开拉链
还有一个拉开拉链
是的倒数拉链
。请注意拉开拉链
并不总是的倒数拉链
,所以你需要一个条件!你能利用你刚才定义的发电机?6.生成有序列表
答:。编写函数命令
检查列表是否为命令;列表中的每个元素都应该是小于或等于下一个元素。
B。编写一个生成器,生成经过排序的整数的随机列表(已订购)。不允许使用sort函数!(也不是讲座中的生成器orderedList……)
提示:首先生成一个随机正整数列表。然后,生成列表中的第一个随机数。然后,生成一个列表其中,每个连续元素对之间的差异是由正整数列表给出。