TDA 452型
DIT迪特142
2016年HT

2016年功能编程
第4周的练习

第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.备份脚本

库模块系统。号码簿提供了功能用于处理文件和目录。使用这些函数编写一个程序

提示:了解哪些功能的一种方法一个包含的模块,因此使用:浏览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……)

提示:首先生成一个随机正整数列表。然后,生成列表中的第一个随机数。然后,生成一个列表其中,每个连续元素对之间的差异是由正整数列表给出。