Как я могу записать приложение, которое не изменяет состояние (на функциональном языке)?

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

Я держал свои ответы краткими. Пожалуйста, обратитесь к книге для подробного объяснения.

Как регулируется смещение? Это отдельно для каждого потребителя?

Зависит от идентификатора группы. Для группы управляется только одно смещение.

Что происходит в случае, когда несколько потребителей (одной и той же группы) используют одну тему?
Потребителей может быть несколько - все могут быть идентифицированы одной и той же или разными группами. Если 2 потребителя принадлежат к одной группе, оба не получат все сообщения.

Получают ли они одни и те же данные?
Нет. После отправки сообщения и подтверждения чтения смещение увеличивается для этой группы. Таким образом, другой потребитель с той же группой не получит это сообщение.

Надеюсь, это поможет:)

6
задан Paweł Hajdan 25 January 2009 в 09:42
поделиться

6 ответов

Полезное приложение в целом должно будет часто изменять положение нескольких дел, но это не означает, что все или Ваши функции должны изменить состояние, чтобы быть полезными.

Монады в функциональном программировании должны выразить ввод/вывод (ввод-вывод) операции и изменения в состоянии, не используя функции языка, которые представляют побочные эффекты.

Я думаю, что Вы думаете только с точки зрения объектно-ориентированного. Просто, потому что функция всегда дает тот же вывод, учитывая тот же вход, не означает, что это не может взять в различных типах входа (возможно бесконечные возможности входа) и произвести различные типы вывода.

С функциональным программированием Вы имеете дело с неизменными объектами вместо изменяемых. Если Вы получаете вход объекта, можно создать новый измененный объект и возврат это.

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

4
ответ дан 8 December 2019 в 16:12
поделиться

Вам не нужно изменяемое состояние для Вашего примера. Поскольку, 'добавляют закладка', новый список закладок может быть создан, который имеет то же содержание как старый список, но с одной новой записью. Это - способ, которым работает большая часть неизменного программирования; вместо того, чтобы вносить изменения в существующий граф объектов, Вы просто создаете новый граф объектов, который отражает новое состояние мира. Когда все неизменно, легко совместно использовать значительные части графа объектов между 'старыми' и 'новыми' версиями.

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

browser = {
 curPage --> "http://current"
 homePage --> "http://home"
 favorites --> { data --> "http://firstFav"
                 next --> { data --> "http://secondFav"
                            next --> null } }
}

Теперь функция 'AddFavorite' взяла бы в качестве входа такую структуру данных и возвратила бы новую структуру данных как так

browser = *{
 curPage --> "http://current"
 homePage --> "http://home"
 favorites --> *{ data --> *"http://newFav"*
                 next --> { data --> "http://firstFav"
                            next --> { data --> "http://secondFav"
                                       next --> null } } }*
}*

Биты, отмеченные с '*', являются новыми объектами - существует новый узел связанного списка впереди избранного, содержа новую строку, и сама структура браузера является новой (это должно быть, так как это имеет новый указатель 'избранного').

Можно смоделировать все вычисление 'с сохранением информации' как это как функции, которые берут в 'предыдущем мире', как введено и возвращают 'следующий мир', как произведено; это - сущность монад состояния на языке как Haskell.

4
ответ дан 8 December 2019 в 16:12
поделиться

Кроме того, на практике много приложений, записанных на языках функционального программирования, действительно на самом деле используют функции побочного эффекта как (установите!) для фактического изменения состояния. Это не теоретически чисто, но это, конечно, сделало задание.

(В особенности я думаю о популярной части потребительского программного обеспечения, которое было записано в производной LISP, но должно было работать в постоянной памяти, таким образом, дела как сборка "мусора" должны были идти из окна.)

0
ответ дан 8 December 2019 в 16:12
поделиться

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

3
ответ дан 8 December 2019 в 16:12
поделиться

Хороший пример, как Вы имеете дело с "переменчивостью". Предположим, что Вы реализуете некоторую структуру данных, скажем, дерево AVL, на функциональном языке. В функциях Вы реализуете (вставьте, удалите, и т.д.), а также внутренние функции (вращаются, и т.д.) Вы на самом деле не видоизменяете данные, но возвращаете видоизмененные данные.

Базовая система во время выполнения гарантирует, что Ваша программа будет использовать память эффективно (например, она делает копию на записи и сборку "мусора").

В частях программы при реальном изменении мирового состояния (ввод-вывод, GUI), существует два подхода.

  • чистые функциональные языки, как Haskell, инкапсулируют такие операции в монадах (предупреждение: Ваша голова могла бы взорваться при чтении о них, но не волнуется слишком много),
  • другие функциональные языки, как OCaml, разрешают переменчивость и побочные эффекты в Ваших программах.
2
ответ дан 8 December 2019 в 16:12
поделиться

Много других ответов будут иметь Вас умчавшийся для использования монад или некоторых других экзотических методов к программе с помощью изменяемого состояния. В то время как я услышал со своими ушами, редактор Отчета о Haskell 98 называет Haskell "самым прекрасным императивным языком в мире", Вам не нужно почти столько изменяемого состояния, сколько другие ответы предлагают. В функциональной программе Вы сохраняете свое состояние в параметрах функции.

Например, я только что закончил писать программу Haskell, которая решает, как создать резервную копию моей музыки к DVD, таким образом, что песни из того же альбома идут на тот же DVD, и каждый DVD (кроме последнего) по крайней мере на 99,9% полон. Список DVD и на список которого альбом продолжается, который постоянно изменяет DVD, но никакие ссылки, монады или другие экзотические функции не включены. Эти значения являются просто параметрами к рекурсивной функции.

Для наблюдения еще некоторых примеров и объяснений прочитайте очень хорошую учебную газету John Hughes Почему Вопросы Функционального программирования.

2
ответ дан 8 December 2019 в 16:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: