实验室作业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
。不要上传任何其他文件。
在提交代码之前,花点时间清理您的代码;让它更简单,移除不必要的东西等。如果你的解决方案不干净,我们将拒绝接受。清洁代码:
- 没有长行(<78个字符)
- 具有一致的布局(避免在代码中使用TAB字符)
- 具有所有顶级函数的类型签名你被要求写
- 有很好的评论
- 没有垃圾(垃圾是未使用的代码、已注释的代码、不必要的注释)
- 没有过于复杂的函数定义
- 不包含任何重复代码(复制和粘贴编程)
请随意使用hlint公司帮助解决许多此类问题和其他haskell风格的问题。如果hlint的建议看起来像是假设对事物有所了解我们在课堂上还没有讲到,你可以忽略它(或者可能将其包含在代码的注释中)。
至消防系统
祝你好运!
更改日志
- 2019-10-05修复了几个错误(Thomas H)
- 2018-10-15为windows中的unicode添加了修复程序。小编辑。
- 2018-10-13第一版(Dave Sands)