方案 - 自定义数据类型?
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
看到将问题越来越小直到达到最基本部分的步骤吗(int
、real
、bool
)?简而言之就是递归。
我希望这可以帮助您开始解决问题。
我有一项学校任务,我必须编写一个函数 '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
看到将问题越来越小直到达到最基本部分的步骤吗(int
、real
、bool
)?简而言之就是递归。
我希望这可以帮助您开始解决问题。