Scheme 功能结构定义

Scheme 功能结构定义,scheme,racket,Scheme,Racket,我正在试着做这个函数 作者手册 它给了一本书,就产生了这本书的作者。这是我为此创建的数据- (define-struct audiobook ( title author length-in-minutes voice-person)) (define-struct ebook ( title author size-in-kolobytes symbol )) (define-struct hardcover (title author number-of-pages genre ))

我正在试着做这个函数

作者手册

它给了一本书,就产生了这本书的作者。这是我为此创建的数据-

(define-struct audiobook ( title author length-in-minutes voice-person))

(define-struct ebook ( title author size-in-kolobytes symbol ))

(define-struct hardcover (title author number-of-pages genre ))

(define audiobook1 (make-audiobook "The Hunger Games" "Suzanne Collins" "50 minutes" "David Larrson"))
(define audiobook2 (make-audiobook "Catching Fire" "Suzanne Collins" "55 minutes" "David Larrson"))
(define audiobook3 (make-audiobook "Mockingjay" "Suzanne Collins" "40 minutes" "David Larrson"))

(define ebook1 (make-ebook "Divergent" "Veronica Roth" "100000kbs" 'Kindle))
(define ebook2 (make-ebook "Dracula" "Bram Stocker " "134000kbs" 'Ebook))
(define ebook3 (make-ebook "Jane Eyre" "Charlotte Brontë " "400000kbs" 'IPad))

(define hardcover1 (make-hardcover "Pursued" "Jud White" "100000kbs" "Crime"))
(define hardcover2 (make-hardcover "Private Berlin" "James Patterson" "100000kbs" "Suspense"))
(define hardcover3 (make-hardcover "Francona" "Terry Francona" "100000kbs" "Sports"))
我试过了

(define (author-of-book n)
        (audiobook-author n))

这给了我一本有声读物的作者。有没有一种方法可以让我不必编写三个单独的函数就可以得到其余函数的作者?(就像电子书作者…

你可以很容易地检查它是什么类型的书,然后再从那里开始

(define (author-of-book b)
    (cond 
        [(audiobook? b) (audiobook-author b)]
        [(hardcover? b) (hardcover-author b)]
        [(ebook? b)     (ebook-author b)]))

这有点冗长,但也不算太糟糕。

这里是另一个可能的实现,比@jozefg的答案略短一点(已测试并正在运行):

cond
表达式返回在每种情况下使用的正确过程,被选中的过程应用于
b
。例如:

(author-of-book audiobook1)
=> "Suzanne Collins"

(author-of-book ebook1)
=> "Veronica Roth"

(author-of-book hardcover1)
=> "Jud White"

您有三个不同的结构,它们共享一个公共子结构:这三个结构都有
标题
作者
。您可以在结构定义中对此共享进行编码:

(define-struct book (title author))

(define-struct (audiobook book) (length-in-minutes voice-person))
(define-struct (ebook book) (size-in-kolobytes symbol))
(define-struct (hardcover book) (number-of-pages genre))
我们已经清理了这三种结构中的字段重复,作为额外的好处,我们可以简单地使用
book author
访问这三种书籍中任何一种的author字段

> (book-author audiobook1)
"Suzanne Collins"
> (book-author ebook1)
"Veronica Roth"
> (book-author hardcover1)
"Jud White"

谢谢你的回复。我确实尝试了一些类似于我提问之前的方法,但它一直在说“函数调用:在开括号后需要一个函数,但找到了一个部分”。这些函数也有同样的含义。我似乎找不出问题。@Josh你确定这不是打字错误吗?上面的代码适合我。也许是因为语言的原因,你用的是哪种语言?我用的是开始语student@Josh这就解释了。试试这个:
(定义(b本书的作者)(第二版((有声读物b)(有声读物作者b))((精装书b)(精装书作者b))((电子书b)(电子书作者b)))
你读过这个吗?:(如果你正在使用教科书的第一版)或者(如果你正在使用第二版)?我没有投反对票,但是当你第一次发布它时,代码是错误的@Soegaard在他的编辑中修复了它,您缺少了实际的函数应用程序
> (book-author audiobook1)
"Suzanne Collins"
> (book-author ebook1)
"Veronica Roth"
> (book-author hardcover1)
"Jud White"