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

函数编程导论
实验室4A

实验室作业4A:简化(2019)

目的

这项为期一周的实验作业提供了使用递归数据类型、为递归数据类型编写quickCheck生成器、使用抽象数据类型以及编写quickCheck属性的一些实践。

截止日期

必须在之前提交10月21日星期一12:00(2019).

这个提交说明和实验3一样,但这次我们不会口头评分。

准备工作

实验室以第5-6周的递归数据类型为基础。

开始工作之前:

注释:在Windows上,似乎无法立即打印Unicode字符,并且在尝试显示多项式时会出现异常。要解决此问题,您需要键入chcp 65001型在运行之前全球温室气体排放指数.

概述

在这个实验中,你将实现一个符号算术表达式的简化程序,包括加法、乘法和整数求幂(x个n个哪里n个为非负Int)

您将使用(但不修改)一个名为Poly.hs公司导出类型的用于表示多项式(表达式如x个 − x个 + 7).

您的简化程序将通过将表达式转换为多项式(Poly),然后再次将其转换回来。由于多项式是以规范的方式表示的,所以这个过程将简化表达式。

A1类

定义数据类型Expr公司表示算术表达式。您的数据类型应该能够表示整数、使用加法和乘法构建的表达式以及单个变量的整数幂x个2,x个9,x个10等。

这里的所有整数都应该使用Haskell的国际类型。对于二进制运算符,应该使用单个构造函数并使用helper类型二进制操作:

数据 二进制操作 = 添加操作 | 多业务运营

你应该能够表示除x个提升到某个整数幂,因此例如,您应该无法表示x个(1 + 1),2x个,2等。

类似地,您应该不能用多个变量表示表达式,因此您应该不能表示x个 + .

A2类
因为我们将纯粹处理整数,所以表达式中的任何负指数都是无效的。定义数据类型不变量prop_Expr::Expr->布尔它检查表达式中任何地方的指数都不是负数。
A3号
制造商Expr公司的实例显示,确保只在需要的地方添加括号。使用Haskell符号表示指数,例如x ^2(x ^2)。你应该表现出来x个1作为公正的x个,但在显示表达式之前,不应以任何方式简化它们。
A4(A4)
制造商Expr公司和的实例任意并使用检查您在A2中定义的数据类型不变量快速检查.
第5页
定义评估::Int->Expr->Int它的值为x个和表达式并对其求值。

实验室的其余部分涉及编写表达式的简化程序。简化的策略是利用库。每个表达式(满足数据类型不变量)都可以转换为多项式。简化只需转换为多项式即可()又回来了!

A6级

定义exprToPoly::Expr->Poly它将表达式转换为多项式。在这里,纯粹递归思考很重要:思考如何通过转换子表达式,然后以合适的方式组合它们来转换更大的表达式。

现在定义(和快速检查)将prop_exprToPoly,它检查从中获得的多项式的求值exprToPoly公司给出了与计算表达式相同的答案。

答7

现在定义向另一个方向运行的函数,polyToExpr::多边形->Expr.注意使用“智能施工人员”参见第6周讲座第二部分以确保您不会在结果中引入类似“垃圾”的乘法1。

编写(并检查)quickCheck属性prop_polyToExpr该功能与A6类似。

A8类
编写函数简化::Expr->Expr它通过将表达式转换为多项式然后再转换回来来简化表达式(这很容易)。
答9
simplize的意思是,它应该以一个简化的表达式结束(当然)。但这完全取决于你如何定义A7。编写quickCheck属性prop_noJunk::Expr->Bool这将检查您的定义是否包含任何“垃圾”:其中垃圾定义为1或0的乘法、零的加法、数字的加法或乘法,或x的幂零。(您可能需要修复A7。)

提交说明

您必须以3人一组的形式提交使用消防系统的申请。

您应该只提交:您的版本实验室4A.hs。不要上传任何其他文件。

在提交代码之前,花点时间清理您的代码;让它更简单,移除不必要的东西等。如果你的解决方案不干净,我们将拒绝接受。清洁代码:

请随意使用hlint公司帮助解决许多此类问题和其他haskell风格的问题。如果hlint的建议看起来像是假设对事物有所了解我们在课堂上还没有讲到,你可以忽略它(或者可能将其包含在代码的注释中)。

至消防系统

祝你好运!

更改日志