Схема структуры с другой структурой


Я пытаюсь самостоятельно изучить схему (drracket) и столкнулся с проблемой.

Я пытаюсь работать с различными формами , такими как круги, квадраты и прямоугольники. Задача состоит в следующем:

"Определите типы "круг", "квадрат" и "прямоугольник"и определите основной тип "фигура". Мне нужна структура shape для следующей части задачи, где я должен определить функцию "area-of-shape" , которая получает базу данных"shape" и которая должна представлять область любого заданной формы.

Вот что у меня есть до сих пор:

(define-struct square (nw lenght))

(define-struct circle (center radius))

(define-struct rectangle (nw width height))

(define-struct shape (...))



(define (area-of-shape shapeA)
  (cond 
    [(square? (shapeA)) (* (square-lenght shapeA) (square-lenght shapeA))]
    [(circle? (shapeA)) (* 3.14 (* (circle-radius shapeA) (circle-radius shapeA)))]
    [(rectangle? (shapeA)) (* (rectangle-width shapeA) (rectangle-height shapeA))]))

Как определить структуру shape? Я попробовал что-то вроде

(define-struct shape (circle square rectangle))

Но это не имело бы никакого смысла, так как структуре понадобились бы все 3 формы.

Любая помощь будет признательна.

2 2

2 ответа:

Структуры ракетки могут наследовать от другой структуры. Итак:

#lang racket

(struct shape ())
(struct square shape (nw length))
(struct circle shape (center radius))
(struct rectangle shape (nw width height))

(define (area-of-shape shape)
  (if (shape? shape)
    (cond
      [(square? shape)    (* (square-length shape) (square-length shape))]
      [(circle? shape)    (* 3.14 (* (circle-radius shape) (circle-radius shape)))]
      [(rectangle? shape) (* (rectangle-width shape) (rectangle-height shape))]
      [else (error 'area-of-shape "Unhandled Shape Condition.")])
    (error 'area-of-shape "Argument not a Shape.")))

;; Example uses
(area-of-shape (square 0 10))
(area-of-shape (circle 0 10))
(area-of-shape (rectangle 0 10 10))

Кстати, для чего-то вроде area-of-shape мне удобнее использовать match, чем cond:

(define (area-of-shape shape)
  (match shape
    [(square _ len)    (* len len)]
    [(circle _ rad)    (* 3.14 (* rad rad))]
    [(rectangle _ w h) (* w h)]))

Я бы сделал это следующим образом:

(define (area-of-shape shapeA)
  (cond 
    [(square?    shapeA) (* (square-lenght shapeA) (square-lenght shapeA))]
    [(circle?    shapeA) (* 3.14 (* (circle-radius shapeA) (circle-radius shapeA)))]
    [(rectangle? shapeA) (* (rectangle-width shapeA) (rectangle-height shapeA))]
    [else (error 'area-of-shape "A shape is either a square, a circle, or, a rectangle")]))