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

函数编程导论
实验室4B

实验作业4B:著名

目标和目的

在这项作业中,你将实施一个小猜谜游戏,电脑试图猜出你在想哪个名人。观看此短片(没有音频)来了解游戏应该如何工作。

游戏保留了一些关于名人的知识(以决策树的形式)。当电脑猜不出你在想哪个著名的人物时,它会问你一些可以用来提高知识水平的信息。积累的知识存储在一个文件中,这样即使你停止游戏并重新开始,它也会被保留下来。

虽然这是一个相当小且简单的游戏,但它将教您如何使用IO以及递归数据类型。而且,与之前的作业不同,这次你自己编写完整的程序,没有现成的模块供你下载,也没有关于如何构建程序的逐步说明,这与之前的任务不同。

截止日期

必须在之前提交10月25日星期五午夜(2019).

这个提交说明与实验室4A的相似。

要求和建议

在本次任务中,我们没有列出需要按给定顺序完成的子任务,而是为您提供了一些实现游戏的总体要求、建议和提示。在开始编写任何代码之前,请阅读所有内容。

“问题回答”决策树

进行一轮游戏

一旦我们有了一个决策树(来自文件或使用默认树),我们就开始沿着树往下走,边走边问问题。一旦你找到一个人,那么猜测就已经决定了。

因此,假设我们按如下方式播放默认决策树:
她是欧洲人吗?是的她是科学家吗?我猜:是伊丽莎白女王二世吗?好吧,这次你赢了。
此时游戏将继续(粗体文本由玩家键入):
只是好奇:你的名人是谁?特蕾莎·梅给我一个问题,“Theresa May”的答案是“是”而“伊丽莎白二世女王”的答案是“不”。她是政治家吗?

此时,游戏应该构建一个扩展的决策树,如下图所示:

扩展决策树

我们建议使用递归函数实现此过程

播放:: 质量保证 -> IO(输入输出) 质量保证

一次返回新的决策树(如果计算机猜对了答案,则该树将保持不变),然后可以将其存储回文件中。

关于IO

如果我们使用readFile::FileName->IO字符串如果文件不存在,则会出现错误,程序将崩溃。这不是我们想要的!这里你应该用

tryIO错误:: IO(输入输出)-> IO(输入输出)(要么 IO错误a)

来自标准模块系统。IO.错误使用tryIO错误(readFile…),我们将可能生成错误的IO指令转换为从不生成任何错误的IO指示,而是返回一个值,该值告诉我们是否存在错误。有关更多信息,请参阅数据类型“要么”和“IOError”的文档。

关于缓冲输出

当程序要求时,大多数操作系统都不会直接在屏幕上写东西。相反,它们会等到一整行打印到屏幕上,然后实际打印出来。当屏幕上打印出一个问题时,这可能会很麻烦,用户必须在同一行上键入答案(就像我们在这个游戏中希望的那样)。为了避免问题不在屏幕上打印,我们告诉操作系统“刷新”程序的输出,即打印屏幕上我们想打印在屏幕上的所有内容,而不是等待当前行结束。haskell指令hFlush标准输出将为我们完成此操作,因此请在使用后使用putStr。。。确保立即打印。您需要包括模块系统。IO(输入输出)为了这个。

程序结构

这个程序的大部分都是IO指令,但这并不意味着你不应该考虑定义有用的函数,这些函数可以在多个地方重用,并且有助于给你的程序提供良好的结构。

作为提示,请考虑定义函数

问题: 字符串 -> IO(输入输出) 字符串

它询问一个问题并返回用户键入的答案。使用此选项,您可以定义

是否问题: 字符串 -> IO(输入输出) 布尔

它会询问是非问题(如果需要,可以重复),直到得到“是”或“否”的答案,然后返回真的当答案是肯定的时候False(错误)当答案是否定的时候。这可以在你的程序中的几个地方使用。

主要功能

整个游戏应该定义为

主要:: IO(输入输出)()

然后您可以通过键入以下命令从终端运行游戏runhaskell著名(这与将文件加载到全球温室气体排放指数和键入主要的). 你也可以编译程序到一个独立的可执行文件中。

提交说明

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

您只应提交:您的版本著名.hs。不要上传任何其他文件。

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

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

至消防系统

祝你好运!

更改日志