В Haskell , языке программирования, понятие монады ввода/вывода используется для отделения (или соединения? (привязки!)) работающего программного обеспечения от его взаимодействия с оборудованием.
Это заставляет меня задаться вопросом, правильно ли думать обо мне как о монаде (программное и аппаратное обеспечение, разум и тело). Или, может быть, я внутри монады ввода/вывода? Или мы все вместе с космосом монада?
Я бы сказал, что есть какая-то определенная часть вас, которая депараллелизует вашу обработку и привязывает ваших референтов к внешним.
Это монада, оболочка, позволяющая безопасно иметь внешние референты, на которые можно воздействовать предсказуемо и долговременно, не будучи постоянно привязанными к ним или содержащими их.
Это не все вы, у многих из вас другие цели. Это просто интерфейс сознания.
Итак, сознание — это монада, большая часть вашей мозговой активности — в значительной степени чистый процесс. (Большинство мыслей воздействуют только на мозг, и ни на что другое, точно так же, как чистый процесс влияет только на состояние процессора, а не на внешний мир.)
Тогда вы, как приложение (несколько) чистого процесса через монаду, являетесь процессом с эффектами.
Монада — это математическая конструкция. Вообще говоря, не принято считать людей математическими конструкциями.
Однако может быть обоснованным утверждение, что вы «хорошо смоделированы как монада». Это означало бы, что большую объяснительную ценность может принести моделирование себя как монады.
Позже, если вы решите, что вы «идеально смоделированы как монада», тогда в игру вступает следующий уровень онтологии, когда вы спросите: «Если я идеально смоделирован как монада, действительно ли я монада?»
Лично я нахожу себя слишком несовершенным, чтобы вписаться в такую кристально чистую математическую конструкцию, поэтому я бы не назвал себя монадой. Может быть, в хороший день вы могли бы смоделировать меня как одного из них.
Достаточно ли вы совершенны, чтобы быть монадой, зависит от вас.
Монада m
— это конструкция для инкапсуляции вычислений. Вы можете думать о монаде как о ящике с функцией внутри него. Привязка монады a
к монаде b
— это размещение блока B в блоке A. Таким образом, вы гарантируете, что функция A будет выполнена раньше, чем функция B: B не может быть выполнена раньше, потому что ей нужен результат A. Таким образом, можно контролировать порядок вычислений в ленивом программировании. язык 1 .
В случае Монады IO цель действительно состоит в том, чтобы связать саму программу (которая чисто функциональна) с внешним миром (который нечист). Это не то же самое, что подключение программного и аппаратного обеспечения. Программа по-прежнему работает на оборудовании (процессоре). Однако с монадой IO чистая функция может иметь побочные эффекты (например, запись в файл). Сами по себе монады являются просто конструкциями и могут использоваться для чего угодно, даже для простой арифметики. Так что сравнивать с человеком можно только с IO Монадой.
Важно то, что с помощью IO Monad вы как-то отделяете побочные эффекты от чистой функции, чтобы она оставалась чистой. Это похоже на человека? Что ж...
Если вы считаете
тогда да, вы вроде как IO Monad. Но есть веские причины не согласиться ни с одним из трех пунктов выше:
Если бы мне пришлось моделировать людей на функциональном языке программирования (и я действительно сделал это, моделируя футбольную команду в 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 = (output "Hello ", output "world!")
При выполнении это может показать как
Hello world!
и , поскольку порядок выполнения функций не определен.world!Hello
Монадическая
output
функция может выглядеть какoutput :: String -> (*World -> (Void, *World))
. Здесь*World
уникальный внешний мир.output
берет строку и возвращает функцию из*World
ничего и новую*World
: функция меняет мир . Функцияprint = output "world!" (snd (output "Hello " world))
Здесь
snd
выдает второй элемент кортежа. Поскольку самому левомуoutput
нужно то*World
, что выдается самым правымoutput
, оно не может быть выполнено до самого правогоoutput
. Поэтому программа всегда выводитHello world!
.Обратите внимание, что этот синтаксис сбивает с толку (это справа налево) и много печатает. В Haskell есть функция связывания (
>>=
), позволяющая легко связать вместе две монады.
Монада — это понятие в теории категорий — теории в математике; он назван так потому, что это простая концепция, полученная из понятия моноида - наиболее (полезно) простейшего из возможных алгебраических устройств.
Это имеет очень мало общего с людьми или даже с космосом.
Что связывает его с понятием монады Либница, так это понятие простоты и очень немногое другое, но это имеет очень много общего с людьми, космосом и Богом; его текст — монадология — целиком о них.
Там все монады являются простыми субстанциями — они не могут быть далее разбиты; они составляют мир или космос: человеческие души, атомы материи и пространства-времени и Бог.
Они не взаимодействуют напрямую, а действуют через установленную Богом гармонию.
Это можно с пользой сравнить с космологией, дошедшей до нас из античности и, возможно, вдохновившей ее: это теория атомов Лукреция. Для третьего тезиса в Монадологии говорится:
То, что не имеет частей, не может быть расширено, не может иметь форму и не может быть разделено. Итак, монады — это истинные атомы природы — элементы, из которых все сделано.
Наиболее заметная разница между ними заключается в том, что лукрецианское божество находится за пределами этого мира - неизменно и постоянно; он не называет никакого отношения между ними; и что человеческий разум состоит из очень тонких атомов; тогда как Либниц заменяет разум душой (он христианский философ); и это один атом - или монада, в его терминологии.
вирмайор
Анкур
Николай-К
Лэй Гонсалес
пользователь9166