首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >球拍- lang plai -定义类型和类型-大小写解释

球拍- lang plai -定义类型和类型-大小写解释
EN

Stack Overflow用户
提问于 2015-10-26 14:59:32
回答 2查看 2K关注 0票数 3

有没有人可以尝试解释一下这两个功能:“定义类型”和“类型-大小写”在PLAI方案中的球拍?我是一个菜鸟程序员,我不太理解球拍网站上的文档。如果有人能提供例子,我将不胜感激。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2015-10-27 02:30:02

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

代码语言:javascript
复制
#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"
票数 3
EN

Stack Overflow用户

发布于 2021-04-04 05:43:24

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

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

例如,在..。

代码语言:javascript
复制
(define cadr
  (lambda (x)
    (car (cdr x))))

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

随着这种区别有望得到澄清,define-type不是一个函数。它与define的相似之处在于,它修改了编程环境,使您可以使用新的名称来引用某些值。它用于定义一个新类型,以及一些允许您使用该类型的函数。

下面是球拍文档中的一个例子:

代码语言:javascript
复制
> (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,那么我们可以通过平方半径并将其乘以Pi来计算面积。如果我们处理的是rectangle,那么我们可以通过将其宽度乘以其高度来计算面积。

前面,我说过define-type不是一个函数,但通过使用它,它定义了一个新类型和一系列允许我们使用该类型的函数。那么它定义的这些新函数是什么呢?请参阅此示例:

代码语言:javascript
复制
> (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函数是自动定义的,它允许我们访问数据类型内部的字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33340072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档