Функциональное программирование - стандартные символы, диаграммы и т. Д

StackOverflow https://stackoverflow.com/questions/825675

Вопрос

У меня есть проблема, которую, как я считаю, лучше всего решить с помощью функционального стиля программирования.

Исходя из очень сложного опыта, я привык разрабатывать программы, включающие диаграммы классов / описания, диаграммы связи, диаграммы состояний и т.д.Однако все эти диаграммы подразумевают или используются для описания состояния системы и различных побочных эффектов, которые действия оказывают на систему.

Существует ли какой-либо стандартизированный набор диаграмм или математических символов, используемых при разработке функциональных программ, или такие программы лучше всего разрабатывать в коротком функционально-псевдокоде (учитывая, что функции будут намного короче императивных аналогов).

Спасибо, Майк

Это было полезно?

Решение

В функциональном программировании есть секретная хитрость.

<Ол>
  • Это в значительной степени безгражданство, поэтому традиционные императивные диаграммы не имеют значения.

  • Большинство обычных математических обозначений для разных сортов также не имеют состояния.

  • Функциональный дизайн больше похож на алгебру, чем на что-либо еще. Вы собираетесь определить функции и показать, что композиция этих функций дает желаемый результат.

    Диаграммы не так необходимы, потому что функциональное программирование несколько проще, чем процедурное программирование. Это больше похоже на обычные математические обозначения. Используйте математические методы, чтобы показать, что ваши различные функции делают правильные вещи.

    Другие советы

    Функциональные программисты больше занимаются написанием уравнений, чем диаграмм.Игра называется уравнительные рассуждения и это в основном связано

    • Замена равных на равные

    • Применение алгебраических законов

    • Случайное доказательство методом индукции

    Идея заключается в том, что вы пишете действительно простой код, который "явно корректен", затем вы используете уравнительные рассуждения, чтобы превратить его во что-то более чистое и / или работающее лучше.Мастером этого искусства является оксфордский профессор по имени Ричард Берд.

    Например, если я хочу упростить выражение схемы

    (append (list x) l)
    

    Я буду заменять равных равными как сумасшедший.Используя определение list Я получаю

    (append (cons x '()) l)
    

    Заменяя тело append, у меня есть

    (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))
    

    И если я снова использую определение append, я получаю

    (cons x l)
    

    который, как я доказал, равен

    (append (list x) l)
    

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

    • λ (лямбда) часто используется для обозначения функция
    • f ο g используется для обозначения функции состав
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top