方案 - 自定义数据类型?

Scheme - Custom datatypes?

我有一项学校任务,我必须编写一个函数 'check()' 以列表作为参数。该列表包含 3 个元素。列表的第一个元素应该是一个运算符,其他 2 个元素应该是数据类型。函数调用的示例如下所示:

(check '(+ int int))

字面上应该说 Int 的地方。不应涉及任何数字。然后,此函数应该 return 正确的输出数据类型,具体取决于您在操作中使用的数据类型。例如:

(check '(+ int int))

应该return int.

它还说: “你的程序应该识别运算符
'+'、'-'、'*'、'/'、'quotient'、'<'、'>'、'='、'和 ,'or' 和数据类型: 'int'、'bool' 和 'real'

测试示例 运行 可能如下所示:

> (check '(+ int int))
int
> (check '(* int bool))
The operator '*' does not accept bools!
> (check '(= (< (+ int int) (quotient int int)) (> int int)))
bool
> (check '(* int (+ real int)))
The operator '+' must have operands of the same numerical type!

这个任务让我很吃惊,因为我从来没有真正在 Scheme 中创建过任何自定义数据类型。甚至不知道这是可能的。我是 Scheme(和一般编程)的新手。我目前不知道从哪里开始或做什么!我需要定义 int、bool 和 real 吗?我需要定义运算符吗?如果是这样……怎么办?有谁能够帮我?告诉我从哪里开始或流程应该是什么样子...

信不信由你,这个问题不是关于自定义数据类型的;它只是一个框架设备,让学生思考 递归

从根本上说,递归是将问题分解成越来越小的部分,直到剩下最基本的部分。在这种类型检查功能的情况下,您会遇到像 (= (< (+ int int) (quotient int int)) (> int int)) 这样的输入,并且必须将它缩减为像 bool.

这样的输出

分解的方法是将像上面这样的大输入视为等同于(= A B),其中A是(< (+ int int) (quotient int int)),B是(> int int)

然后将 A 分解为 (< C D),其中 C 为 (+ int int),D 为 (quotient int int)。然后你应用问题中给出的规则。特别适用以下规则:

  • C = (+ int int)int
  • D = (quotient int int)int
  • A = (< C D)(< int int)bool
  • B = (> int int)bool
  • (= A B)(= bool bool)bool

看到将问题越来越小直到达到最基本部分的步骤吗(intrealbool)?简而言之就是递归。

我希望这可以帮助您开始解决问题。