定义类型和类型大小写的解释



有人能试着解释一下球拍中PLAI方案中的"define-type"one_answers"type-case"这两个函数吗?我是一个新手程序员,我不太理解球拍网站上的文档。如果有人能提供例子,将不胜感激。谢谢。

下面是如何使用define-typetype-case的一个小示例:

#lang plai
; A ListOfNumbers are either
; is either an empty list of numbers
; or is constructed to two things a, and, d,
; where a is a number and d is a list of numbers.
(define-type ListOfNumbers
  (Empty)
  (Cons (a number?) (d ListOfNumbers?)))
; construct a list of numbers as an example
(define a-list (Cons 42 (Cons 43 (Empty))))    
a-list   ; prints: (Cons 42 (Cons 43 (Empty)))
(type-case ListOfNumbers a-list
  (Empty ()     "the list is empty")
  (Cons (a d)  (~a "the first number in the list is " a)))
; prints: "the first number in the list is 42"

我对Lisp/Scheme/Racket不是很有经验,但看起来这个问题在5年后仍然没有答案,所以我要试一试。

首先,注意并不是所有东西都是函数。例如,当您使用define定义函数或其他值时,define不作为函数。函数是接受输入,然后返回输出的东西。define不这样做。相反,它改变了您正在编程的环境,以便存在一个可用于引用某些值的新名称。

例如,在…

(define cadr
  (lambda (x)
    (car (cdr x))))

define修改编程环境,使函数cadr现在存在。cadr是一个函数(如果你用一些输入调用它,它会产生一些输出),但define本身不是一个函数(你不是用一些输入调用define来获得一些输出)。

希望这个区别澄清了,define-type不是一个函数。它类似于define,因为它修改了编程环境,以便您有新的名称来引用某些值。它用于定义一个新类型,以及一些允许您使用该类型的函数。

取自Racket文档的一个例子:

> (define-type Shape
    [circle (radius : number)]
    [rectangle (width : number)
               (height : number)])
> (define (area [s : Shape])
    (type-case Shape s
      [circle (r) (* (* r r) 3.14)]
      [rectangle (w h) (* w h)]))
> (area (circle 1))
- number
3.14
> (area (rectangle 2 3))
- number
6

这里定义了一个新的类型Shape,它说它有两个变体:circlerectangle。它进一步说,在circle变体的情况下,有趣的数据是它的radius,这是一个数字;在rectangle变体中,有两段数据(或"字段"),它们是widthheight(都是数字)。

然后定义了一个新函数area,该函数的输入类型为Shape(我们刚才声明的类型)。type-case表达式用于指定如何根据所处理的变量计算Shape的面积。如果我们处理的是circle那么我们可以通过半径的平方乘以来计算面积。如果我们处理的是rectangle,那么我们可以通过将其宽度乘以其高度来计算面积。

前面,我说过define-type不是一个函数,但是由于使用它,它定义了一个新类型和一堆允许我们使用该类型的函数。它定义的这些新函数是什么?请看下面的例子:

> (define c (circle 10))
> c
- Shape
(circle 10)
> (circle? c)
- boolean
#t
> (circle-radius c)
- number
10
> (define r (rectangle 2 3))
> (+ (rectangle-width r) (rectangle-height r))
- number
5

在这里,我们使用define修改编程环境,使名称c指的是我们创建的半径为10的圆。circle?是在前面示例中执行define-type时自动创建的函数,它返回我们正在处理的shape是否为circle变体(与rectangle变体相反)。类似地,当我们使用define-type时,circle-radiusrectangle-widthrectangle-height函数是自动为我们定义的,它们允许我们访问数据类型内部的字段。

相关内容

  • 没有找到相关文章

最新更新