Я монада? Мы монада? (программное и аппаратное обеспечение)

В Haskell , языке программирования, понятие монады ввода/вывода используется для отделения (или соединения? (привязки!)) работающего программного обеспечения от его взаимодействия с оборудованием.

Это заставляет меня задаться вопросом, правильно ли думать обо мне как о монаде (программное и аппаратное обеспечение, разум и тело). Или, может быть, я внутри монады ввода/вывода? Или мы все вместе с космосом монада?

Я не слишком хорошо знаком с Haskell, но монада ввода-вывода и идея монады Лейбница кажутся довольно далекими друг от друга, поскольку монада Лейбница не взаимодействует со своей средой, по крайней мере, не в том случае, если она принимает входные данные из среды, а затем делает что-то смысл.
Если вы серьезно отнесетесь к любой аналогии, вы в конечном итоге станете чем угодно - даже самим вопросом о стеке обмена :)
Я не уверен, какое здесь правильное определение программного обеспечения, если вы хотите сказать, что монада ввода-вывода отделяет его от аппаратного обеспечения. Или каким образом ввод действительно связан с аппаратным обеспечением — если вы думаете о пользователе, нажимающем цифровую кнопку во время работы программы, существует связь, которую я вам, безусловно, предоставляю. Работающий код — это аппаратное обеспечение, работающее в соответствии с программными правилами. Я бы сказал, что эта монада позволяет вам инкапсулировать работающий код, чтобы дальнейший ввод не влиял на него. Это вопрос программного обеспечения или аппаратного обеспечения?
Разве это не связано? «Теория Лейбница наиболее известна как решение проблемы разума и тела о том, как разум может взаимодействовать с телом» en.wikipedia.org/wiki/Pre-installed_harmony
@LayGonzález Я уверен, что это причина такого имени. Люди, разрабатывающие компьютерные языки и связанные с ними концепции, часто очень любят глубокие метафоры, граничащие с каламбуром. И это будет примером такового. Монады были бы единственным способом взаимодействия между независимыми процессами, а также единственным способом влияния процесса на мир вне компьютера.

Ответы (4)

Я бы сказал, что есть какая-то определенная часть вас, которая депараллелизует вашу обработку и привязывает ваших референтов к внешним.

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

Это не все вы, у многих из вас другие цели. Это просто интерфейс сознания.

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

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

мысли излучают тепло. воздействует на непосредственную воздушную среду, что может вызвать расширение и повышенное давление в помещении, что может стать решающим фактором в падении очень-очень неустойчивой безделушки на полку, если к ней будут добавлены вибрации от сосед гуляет например. Вы можете решить вернуть его на место и пропустить важный телефонный звонок, потому что ушли слишком далеко от него, чтобы вовремя ответить...
Идеальной изоляции не бывает, но это исключительно глупый пример. Количество тепла, которое излучает мозг, имеет мало общего с мышлением.
шутки в сторону, кажется, я где-то читал, что это очень важно! Существует отклонение на 20 Вт выше базового уровня 20/30 Вт.

Монада — это математическая конструкция. Вообще говоря, не принято считать людей математическими конструкциями.

Однако может быть обоснованным утверждение, что вы «хорошо смоделированы как монада». Это означало бы, что большую объяснительную ценность может принести моделирование себя как монады.

Позже, если вы решите, что вы «идеально смоделированы как монада», тогда в игру вступает следующий уровень онтологии, когда вы спросите: «Если я идеально смоделирован как монада, действительно ли я монада?»

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

Достаточно ли вы совершенны, чтобы быть монадой, зависит от вас.

Монада m— это конструкция для инкапсуляции вычислений. Вы можете думать о монаде как о ящике с функцией внутри него. Привязка монады aк монаде b— это размещение блока B в блоке A. Таким образом, вы гарантируете, что функция A будет выполнена раньше, чем функция B: B не может быть выполнена раньше, потому что ей нужен результат A. Таким образом, можно контролировать порядок вычислений в ленивом программировании. язык 1 .

В случае Монады IO цель действительно состоит в том, чтобы связать саму программу (которая чисто функциональна) с внешним миром (который нечист). Это не то же самое, что подключение программного и аппаратного обеспечения. Программа по-прежнему работает на оборудовании (процессоре). Однако с монадой IO чистая функция может иметь побочные эффекты (например, запись в файл). Сами по себе монады являются просто конструкциями и могут использоваться для чего угодно, даже для простой арифметики. Так что сравнивать с человеком можно только с IO Монадой.

Важно то, что с помощью IO Monad вы как-то отделяете побочные эффекты от чистой функции, чтобы она оставалась чистой. Это похоже на человека? Что ж...

Это зависит.

Если вы считаете

  1. существует четкое различие между разумом и телом
  2. разум чисто математический
  3. человек определяется как то, что позволяет уму оставаться чисто математическим при соединении с телом

тогда да, вы вроде как IO Monad. Но есть веские причины не согласиться ни с одним из трех пунктов выше:

  1. Аргументы против дуализма
  2. Как насчет эмоций?
  3. Неужели человек больше этого? Разве человек не существует также и из самих его разума и тела?

Лучшая аналогия

Если бы мне пришлось моделировать людей на функциональном языке программирования (и я действительно сделал это, моделируя футбольную команду в Clean несколько месяцев назад ), я бы рассматривал человека как функцию, которая берет мир и дает новый мир: человека. имеет органы чувств, с помощью которых он наблюдает за миром, обрабатывает их и каким-то образом изменяет мир, действуя. Таким образом, мы могли бы записать тип человека как Human :: World -> World.

Теперь важно, что мы не можем написать функцию, которая применяет действия двух людей, например

two_humans :: Human Human World -> (World, World)
two_humans h1 h2 world = (h1 world, h2 world)

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

Сноски

1: Что такое контрольный порядок оценки?

В ленивом языке программирования функции выполняются, когда нужен результат, а не когда процессор достигает точки, когда функция написана. Предположим, есть простая функция output :: String -> Void, которая выводит входную строку на экран и ничего не дает, можно было бы написать функцию print:

print = (output "Hello ", output "world!")

При выполнении это может показать как Hello world!и , поскольку порядок выполнения функций не определен.world!Hello

Монадическая outputфункция может выглядеть как output :: String -> (*World -> (Void, *World)). Здесь *Worldуникальный внешний мир. outputберет строку и возвращает функцию из *Worldничего и новую *World: функция меняет мир . Функция printбудет записана как

print = output "world!" (snd (output "Hello " world))

Здесь sndвыдает второй элемент кортежа. Поскольку самому левому outputнужно то *World, что выдается самым правым output, оно не может быть выполнено до самого правого output. Поэтому программа всегда выводит Hello world!.

Обратите внимание, что этот синтаксис сбивает с толку (это справа налево) и много печатает. В Haskell есть функция связывания ( >>=), позволяющая легко связать вместе две монады.

Монада — это понятие в теории категорий — теории в математике; он назван так потому, что это простая концепция, полученная из понятия моноида - наиболее (полезно) простейшего из возможных алгебраических устройств.

Это имеет очень мало общего с людьми или даже с космосом.

Что связывает его с понятием монады Либница, так это понятие простоты и очень немногое другое, но это имеет очень много общего с людьми, космосом и Богом; его текст — монадология — целиком о них.

Там все монады являются простыми субстанциями — они не могут быть далее разбиты; они составляют мир или космос: человеческие души, атомы материи и пространства-времени и Бог.

Они не взаимодействуют напрямую, а действуют через установленную Богом гармонию.

Это можно с пользой сравнить с космологией, дошедшей до нас из античности и, возможно, вдохновившей ее: это теория атомов Лукреция. Для третьего тезиса в Монадологии говорится:

То, что не имеет частей, не может быть расширено, не может иметь форму и не может быть разделено. Итак, монады — это истинные атомы природы — элементы, из которых все сделано.

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