Функциональные программисты больше пишут уравнения, чем пишут диаграммы. Игра называется эквациональное рассуждение и включает в себя
Подставляя равно для равных
Применение алгебраических законов
Случайное доказательство по индукции
Идея состоит в том, что вы пишете действительно простой код, который «явно корректен», а затем вы используете эквациональные рассуждения, чтобы превратить его во что-то более чистое и / или более эффективное. Мастером этого искусства является профессор из Оксфорда по имени Ричард Берд.
Например, если я хочу упростить выражение схемы
(append (list x) l)
Я заменю равных на сумасшедших. Используя определение list
, я получаю
(append (cons x '()) l)
Подстановка тела дополнения у меня
(if (null? (cons x '()))
l
(cons (car (cons x '())) (append (cdr (cons x '())) l)))
Теперь у меня есть эти алгебраические законы:
(null? (cons a b)) == #f
(car (cons a b)) == a
(cdr (cons a b)) == b
и подставляя равные для равных, я получаю
(if #f
l
(cons x (append '() l))
С другим законом, (if #f e1 e2) == e2
, я получаю
(cons x (append '() l))
И если я добавлю определение добавления снова, я получу
(cons x l)
, которое я доказал, равно
(append (list x) l)