Укоротить спичкой - PullRequest
       7

Укоротить спичкой

0 голосов
/ 26 ноября 2018

как заменить оператор if на совпадение с тем, что код легче читать и понимать?

(: f (t1 -> integer))
(define f
(lambda (x)
   (if (natural? (t1-b x))
       (+ (t1-a x)
          (t1-b x)
          (t1-c x))
       (if (and (= (t2-e (t1-b x)) 1)
                (= (t2-d (t1-b x)) 1))
           10
           (- (+ (t2-d (t1-b x))
                 (t2-e (t1-b x)))
              (t1-a x))))))

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вы не предоставляете определения структуры для t1 или t2, поэтому я сделаю предположение.

(struct t1 [a b c] #:transparent)
(struct t2 [d e] #:transparent)

Предполагая, что эти определения соответствуют вашим, я могу перевести каждую ветвь-вопрос и ответ.

Ветвь 1, условие с использованием шаблона ?, именование для исключения селекторов

Первое условие ветвления (natural? (t1-b x)) можно преобразовать в

(t1 _ (? natural?) _)

Шаблон ? применяет предикат к значению, с которым сопоставляется, и сопоставляется только тогда, когда предикат возвращает true.Чтобы найти документацию, поищите (? expr pat ...) в документации по .

И, так как вы используете селекторы t1-a, t1-b и t1-c в ветви-ответ, вы можете назвать их

(t1 a (? natural? b) c)

так, чтобы вся ветвь выглядела как

[(t1 a (? natural? b) c)
 (+ a b c)]

ветвь 2, используя буквенные шаблоны, такие как 1

Второйусловие ветвления

(and (= (t2-e (t1-b x)) 1)
     (= (t2-d (t1-b x)) 1))

Может быть переведено в

(t1 _ (t2 1 1) _)

И, так как вы не используете селекторы в ответе на ветвь, это не помогает называть символы подстановки,и всю пару вопрос-ответ можно перевести в

[(t1 _ (t2 1 1) _)
 10]

Ветвь 3, исключив вложенные селекторы, начинающиеся изнутри

Для этого вопроса ветвления нет, но естьСелекторы, используемые в теле:

(- (+ (t2-d (t1-b x))
      (t2-e (t1-b x)))
   (t1-a x))))

Сначала уберите селекторы для t1 на x:

[(t1 a b _)
 (- (+ (t2-d b)
       (t2-e b))
    a)]

Затем уберите селекторы для t2 на b:

[(t1 a (t2 d e) _)
 (- (+ d e)
    a)]

Собираем все вместе

Соединяем три ветви вместе в (match x branch1 branch2 ...) в теле

; assuming these struct definitions
(struct t1 [a b c] #:transparent)
(struct t2 [d e] #:transparent)

(: f (t1 -> integer))
(define f
  (lambda (x)
    (match x
      [(t1 a (? natural? b) c)
       (+ a b c)]
      [(t1 _ (t2 1 1) _)
       10]
      [(t1 a (t2 d e) _)
       (- (+ d e)
          a)])))
0 голосов
/ 26 ноября 2018

Это не хороший вариант использования для match, условия не подходят для сопоставления с образцом.Но мы можем упростить вложенные условные выражения, используя cond:

(define (f x)
  (cond ((natural? (t1-b x))
         (+ (t1-a x)
            (t1-b x)
            (t1-c x)))
        ((and (= (t2-e (t1-b x)) 1)
              (= (t2-d (t1-b x)) 1))
         10)
        (else
         (- (+ (t2-d (t1-b x))
               (t2-e (t1-b x)))
            (t1-a x)))))
...