Схема структуры с другой структурой
Я пытаюсь самостоятельно изучить схему (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))
Любая помощь будет признательна.
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")]))