Scheme - 自定义数据类型?

时间:2016-11-18 18:34:55

标签: types scheme abstraction

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

(check '(+ int int))

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

(check '(+ int int))

应该返回int。

它还说: "您的程序应该识别操作员
' +',' - ',' *',' /','商',& #39;<&#;&#;;'>',' =','和,'或' 和数据类型: ' INT''布尔'和'真实'

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

> (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吗?我需要定义运算符吗?如果是这样......怎么样?有谁能够帮我?告诉我从哪里开始或过程应该是什么样的......

1 个答案:

答案 0 :(得分:0)

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

从根本上说,递归就是将问题分解成越来越小的碎片,直到你剩下最基本的碎片。对于此类型检查功能,您遇到类似@Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { // your code here ... Contact c = contactList.get(contactHolder.getAdapterPosition()); bitmap = Bitmap.createScaledBitmap(bitmap,(int)(bitmap.getWidth()*0.8), (int)(bitmap.getHeight()*0.8), true); contactHolder.thumbnail.setImageBitmap(bitmap); Log.e("ProfileImage", c.getmProfileImage()); SaveImages(bitmap, c.getmProfileImage()); } 的输入,必须将其缩减为(= (< (+ int int) (quotient int int)) (> int int))之类的输出。

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

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

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

在获得最基本的内容(boolintreal)之前,请参阅减少问题的步骤。简而言之就是递归。

我希望这有助于您开始解决问题。