第5周练习:高阶函数和测试数据生成
以下是一些练习,旨在帮助您使用高阶函数和测试数据。请打印出来,为这些练习做好准备,并且打印出链接引用的代码示例和文档。
如果你没有时间做所有这些练习,不用担心。这些练习旨在提供足够的工作来保持最经验丰富的学生很忙。如果你做了所有标有(*)的练习可能理解了本周的内容。
下面的一些练习涉及编写QuickCheck属性。的部分那些需要你运行QuickCheck的练习显然不太适合做小组练习。这些部分你也可以在家里自己做在锻炼之前(作为准备)或之后。
祝你好运!
(*)定义长度
函数使用地图
和总和
.
(*)什么是map(+1)(映射(+1)xs)
做什么?你能总结出关于map f(映射g xs)
,其中(f)
和克
是任意函数吗?
给出的类型,并定义函数iter公司
以便
iter公司 n个 (f) x个 = (f)((f)(...((f) x个)))
哪里(f)
发生n个
在等式右侧的时间。例如,我们应该iter 3 f x=f(f(f x))
和iter 0 f x
应该返回x个
.以下函数的类型和效果是什么?
哪里成功
是后继函数,它将值增加一:成功33
34
(*)你如何定义自然数1的平方和n个
使用地图
和文件夹
?
功能如何
神秘 X轴 = 文件夹(++)[](地图 唱 X轴)哪里
唱 x个 =[x个]
表现?(*)如果身份证件
是多态标识函数,由id x=x
,解释表达式的行为
(身份证f)(身份证id)(身份证件f)
如果(f)
类型为国际 -> 布尔
,在它最常见的类型的什么实例上一 -> 一
是身份证件
在每种情况下使用?定义函数作曲家列表
它构成了一个列表将函数转换为单个函数。你应该给出作曲家列表
,并解释函数为何具有此类型。函数对空函数列表的影响是什么?
(*)定义函数
轻弹 ::(一 -> b条 -> c(c))->(b条 -> 一 -> c(c))
它颠倒了函数参数接受参数的顺序。以下示例显示了轻弹
:
翻转div 3 100
33
不要忘记编写适当的QuickCheck属性,检查您的定义的行为符合预期。
(要快速检查接受函数参数的属性,请确保进口文本。显示。功能
!)
2(*)。列出理解和高阶函数
你能用高阶重写下面的列表理解吗函数地图
和滤波器
? 你可能需要这个功能凹面(concat)
也是。-
[x+1|x<-xs]
-
[x+y|x<-xs,y<-ys]
-
[x+2|x<-xs,x>3]
-
[x+3|(x,_)<-xys]
-
[x+4|(x,y)<-xys,x+y<5]
-
[x+5|仅x<-mxs]
你能用另一种方法吗?也就是说,将以下表达式重写为列出理解。
-
地图(+3)xs
-
过滤器(>7)xs
-
concat(映射(\x->map(\y->(x,y))ys)xs)
-
过滤器(>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函数的使用!(而不是发电机有序列表
从讲座中……)提示:首先生成一个随机的正整数列表。然后,在列表中生成第一个随机数。然后,生成一个列表,其中每个连续对之间的差异元素由正整数列表给出。
确保检查生成器是否通过写入合适的财产!