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

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

第5周练习:高阶函数和测试数据生成

以下是一些练习,旨在帮助您使用高阶函数和测试数据。

请打印出来,为这些练习做好准备,并且打印出链接引用的代码示例和文档。

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

下面的一些练习涉及编写QuickCheck属性。的部分那些需要你运行QuickCheck的练习显然不太适合做小组练习。这些部分你也可以在家里自己做在锻炼之前(作为准备)或之后。

祝你好运!

1 (*). 第9-10章的练习函数式编程的技巧

不要忘记编写适当的QuickCheck属性,检查您的定义的行为符合预期。

(要快速检查接受函数参数的属性,请确保进口文本。显示。功能!)

2(*)。列出理解和高阶函数

你能用高阶重写下面的列表理解吗函数地图滤波器? 你可能需要这个功能凹面(concat)也是。

  1. [x+1|x<-xs]
  2. [x+y|x<-xs,y<-ys]
  3. [x+2|x<-xs,x>3]
  4. [x+3|(x,_)<-xys]
  5. [x+4|(x,y)<-xys,x+y<5]
  6. [x+5|仅x<-mxs]

你能用另一种方法吗?也就是说,将以下表达式重写为列出理解。

  1. 地图(+3)xs
  2. 过滤器(>7)xs
  3. concat(映射(\x->map(\y->(x,y))ys)xs)
  4. 过滤器(>3)(映射(\(x,y)->x+y)xys)
不要忘记使用QuickCheck检查您的答案!

3 (*). 正在生成列表

有时我们想生成一定长度的列表。

答:。编写生成器

长度列表 :: 整数 -> 消息  -> 消息[]
这样listOf n g生成n个元素的列表,其中每个元素由g生成。您将使用什么属性写测试生成器是否正常工作?

B。现在使用长度列表编写一个生成器来生成相同、随机、长度。

C、。看看标准的Haskell函数zip和unzip:

拉链   ::[]->[b条]->[(,b条)]拉开拉链 ::[(,b条)]->([],[b条])
写下这两个属性;一个表示zip与解压缩,解压缩是zip的倒数。请注意,解压缩并不总是zip的反义词,所以您需要一个条件!你能利用一下发电机吗你刚刚定义了?

提示:创建数据类型

数据 两个相同长度列表  = 相同长度[] []
并使用B部分的发电机制作上述类型的发电机。然后,使上述类型成为Arbitrary的实例。最后,您可以使用它写下你的财产。

另一种可能性是使用QuickCheck功能面向所有人,稍后我们可能会在课程中看到。

4.生成有序列表

编写一个生成器,生成经过排序的整数的随机列表(已订购),没有sort函数的使用!(而不是发电机有序列表从讲座中……)

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

确保检查生成器是否通过写入合适的财产!