Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки Cтатьи на компьютерные темы Компьютерный юмор Прочее

Масштабируемые архитектуры программ

Шаблоны проектирования Haskell отличаются от основных шаблонов проектирования одним важным способом:

  •     Обычная архитектура: объединить несколько компонентов типа A для генерации «сети» или «топологии» типа B.
  •     Архитектура Haskell: объединить несколько компонентов типа A для генерации нового компонента того же типа A, неотличимого по характеру от его заместителей.
        Это различие влияет на развитие двух архитектурных стилей по мере роста кодовых оснований. Обычная архитектура требует абстракции слоев сверху абстракции:
  •     О нет, эти Bs не соединяются, поэтому давайте создадим сеть Bs и назовем C.
  •     Хорошо, я хочу собрать несколько Cs, так что давайте создадим сеть Cs и назовём это D.
        Вымойте, промойте и повторите, пока у вас не будет неуправляемой башни абстракций.

        Благодаря архитектуре в стиле Haskell вам не нужно сохранять слои на абстракциях, чтобы сохранить способность комбинировать совместимость. Когда вы объединяете вещи, результат все же сам комбинируется. Вы не различаете компоненты и сети компонентов.

        На самом деле этот принцип должен быть знаком любому, кто знает основы арифметики. Когда вы объединяете связку чисел, вы возвращаете число:
3 + 4 + 9 = 16
        Нулевое или большее количество цифр поступает и выдается ровно одно число. Полученное число само по себе можно комбинировать. Вам не нужно узнавать о «веб-сайтах» номеров или «веб-сайтах» номеров «Интернет». Вам не нужно узнавать о паутине (сети) чисел или о паутине паутин (сети сетей) чисел.

        Если ученики начальной школы могут овладеть этим принципом, то, возможно, мы тоже сможем. Как мы можем сделать программирование более похожим на дополнение?
(+) :: Int -> Int -> Int
... и 0 гарантирует, что мы всегда можем преобразовать менее одного числа в ровно одно число, предоставив подходящее значение по умолчанию:
0 :: Int
Это будет хорошо знакомо программистам Haskell: эти сигнатуры типа напоминают методы класса типа Monoid:
class Monoid m where
    -- `mappend` аналогичен `(+)`
    mappend :: m -> m -> m

    -- `mempty` аналогичен `0`
    mempty  :: m
        Другими словами, класс типа Monoid является каноническим примером этого архитектурного стиля Haskell. Мы используем mappend и mempty для объединения 0 или более ms в ровно 1 m. Получаемый m все еще можно комбинировать.

        Не каждая абстракция Haskell реализует Monoid, и не нужно, потому что теория категорий берет эту основную идею Monoid и обобщает ее на более мощные домены. Каждое обобщение сохраняет тот же основной принцип сохранения комбинируемости.

        Например, категория - это всего лишь типизированный моноид, где не все комбинации проверяют тип:
class Category cat where
    -- `(.)` аналогичен `(+)`
    (.) :: cat b c -> cat a b -> cat a c

    -- `id` аналогичен `0`
    id  :: cat a a
... Монада похожа на моноид, где мы объединяем функторы «по вертикали»:
-- Слегка модифицируем из исходного типа класса
class Functor m => Monad m where
    -- `join` аналогичен `(+)`
    join :: m (m a) -> m a

    -- `return` аналогичен `0`
    return :: a -> m a
... и аппликация похожа на моноид, где мы объединяем функторы «по горизонтали»:
-- Очень измененный, но эквивалентный исходный тип класса
class Functor f => Applicative f where
    -- `mult` аналогичен `(+)`
    mult :: f a -> f b -> f (a, b)

    -- `unit` аналогичен `0`
    unit :: f ()
        Теория категорий полна обобщенных моделей, подобных этим, и все они пытаются сохранить эту базовую интуицию, которую мы получили для добавления. Мы конвертируем несколько вещей в одну вещь, используя что-то похожее на дополнение, и мы конвертируем менее одной вещи в одну вещь, используя что-то похожее на ноль. Как только вы научитесь мыслить с точки зрения этих шаблонов, программирование становится таким же простым, как и базовая арифметика: вступают комбинируемые компоненты, и получается только один комбинируемый компонент.

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

        Перевод с английского, автор: , 2010 г., оригинал: Scalable program architectures

Последняя правка: 2018-03-24    21:19


Написать отзыв

Написать автору можно на электронную почту mail(аt)compiler.su

Авторизация

Регистрация

Выслать пароль

Карта сайта


Каким должен быть язык программирования?

Анализ и критика

Описание языка

Компилятор

Отечественные разработки

Cтатьи на компьютерные темы

Двадцать тысяч строк кода, которые потрясут мир?

Почему владение/заимствование в Rust такое сложное?

Масштабируемые архитектуры программ

Почему Хаскелл так мало используется в отрасли?

Бесплатный софт в мышеловке

Исповедь правового нигилиста

Русской операционной системой должна стать ReactOS

Почему обречён язык Форт

Программирование без программистов — это медицина без врачей

Электроника без электронщиков

Компьютерный юмор

Прочее

Последние комментарии

2018/04/16 15:09, Олег
Русский язык и программирование

2018/04/02 22:42, rst256
Программирование без программистов — это медицина без врачей

2018/03/25 21:14, Денис Будяк
Энтузиасты-разработчики компиляторов и их проекты

2018/03/21 23:37, Marat
Почему обречён язык Форт

2018/03/10 20:05, Comdiv
«Двухмерный» синтаксис Python

2018/02/24 14:51, Эникейщик
Русской операционной системой должна стать ReactOS

2017/12/12 13:32, Comdiv
Отечественные разработки

2017/11/05 17:26, rst256
Электроника без электронщиков