TDA 555型
DIT 440型
HT(高温)2019

函数编程导论
第4周的练习

第4周的练习:IO和测试

以下是一些练习,旨在帮助您练习使用IO编程,测试数据生成和属性。

如果你没有时间做所有这些练习,不要担心。这些练习旨在提供足够的工作来保持经验丰富的学生很忙。如果你做了所有标有(*)的练习可能理解了本周的内容。

0 (*). 基本IO

(基于汤普森的问题,第18章)。

答:。编写一个IO程序,首先读取正比如说整数n个,然后读取n个整数和写入他们的总和。程序应适当提示输入和解释其输出。

B。编写一个重复读取整数的程序(每个行),直到找到零值并输出输入读取。在这种情况下,哪种排序算法最合适案件?

C、。定义函数

重复 :: IO(输入输出) 布尔 -> IO(输入输出)()-> IO(输入输出)()
这样的话重复测试操作具有以下效果重复操作直到条件测试真的.

1 (*). 查找函数的属性

考虑以下标准Haskell函数,该函数在成对列表(表)中查找元素:
查找 :: 等式  =>  ->[(b)]-> 也许 吧 b
查找 x个[]= 没有什么
查找 x个((x’):xys公司)| x个 == x’         = 只是 
    | 否则       = 查找 x个 xys公司
定义属性prop_LookNothing(prop_LokNothing)表示如果look函数交付没有什么然后我们要找的东西不在桌子上。

还定义属性prop_LookJust(查看刚刚)这表明如果look函数提供结果只是 然后是这对(x个)应该在桌子上。

同时写入属性推进_查看结合在一起prop_LookNothing(prop_LokNothing)属性(_J)进入之内一个属性.

2.prefixOf函数的属性

考虑以下Haskell函数(称为是前缀在中数据。列表模块),用于检查列表是否是另一个列表的前缀:
前缀Of :: 等式  =>[]->[]-> 布尔
前缀Of[]_          = 真的
前缀Of _[]= False(错误)
前缀为(x个:X轴) (:)= x个 ==  && 前缀Of X轴 

定义属性prop_prefix自身表示取任意数量的元素(使用)从字符串给出前缀为的列表.

你能为是后缀(它检查一个列表是否是另一个列表的后缀)?

的替代实现前缀Of可以是

前缀Of_alt :: 等式  =>[]->[]-> 布尔
前缀Of_alt X轴  = (长度 )X轴 == 

与其实际使用此定义,不如尝试将此定义用作属性。即写一个属性前缀Of使用长度==同上。

你认为这是一个很好的测试属性吗前缀Of? 想想这个属性是真是假。

3 (*). 猜数字游戏

在本练习中,您将实现“数字猜谜游戏”在哈斯克尔。

这是一个如何工作的示例:

主菜单>游戏想想一个介于1和100之间的数字!是50吗?较高的是75吗?降低是62吗?降低是56吗?太好了,我赢了!
文本看起来像这样是用户输入的内容。其他文本由程序生成。

实现一个功能

游戏 :: IO(输入输出)()
这就是这个游戏的一个例子。

您可能需要以下功能:

获取线路 :: IO(输入输出) 字符串         --读取一行用户输入输入StrLn :: 字符串 -> IO(输入输出)()--输出一行文本
在开始编程之前,为最小化猜测次数的计算机!

4.备份脚本

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

提示:了解哪些功能的一种方法一个包含的模块,因此使用:浏览GHCi中的命令。

前奏曲>:模块系统。号码簿前奏曲系统。目录>:浏览...创建目录::文件路径->IO(输入输出)()doesDirectoryExist::文件路径->IO(输入输出) 布尔...

这为您提供了函数的名称和类型,但您可能仍然需要查阅文档以了解如何使用它们。以下是模块文档的链接包含在最新版本的GHC中:

您可能还需要执行所有操作列表。你可能会发现函数

序列 ::[IO(输入输出) ]-> IO(输入输出)[]
对此很有用。(实际的序列类型更一般,但就目前而言,更容易将其视为具有这种更具体的类型)。