LINUX.ORG.RU

Монады vs макросы vs фекспры

 , , ,


3

4

Эти все вещи имеют нечто общее — контроль над порядком вычислений. Однако, почему то, я никогда не видел сравнения их с этой точки зрения. Постараюсь восполнить этот пробел, а вы дополните, или возразите. Я привожу градацию в пороядке «от сильного к слабому»

1) fexprs. Имеют полный контроль над вычислениями.

2) macros. Имеют контроль над вычислениями, ограниченный временем компиляции.

3) monads. То же самое, что п. 2, за исключением того, что в теле функции невозможно получить само выражение аргумент, «как он есть», а лишь его вычисленное значение.

Возможно я ошибаюсь, поэтому дополняйте и исправляйте.

Ответ на: комментарий от fmdw

ок, принято. Т.к. Identify не создает вычислительного контекста, то он может не выполняться, если не используется. С нетерпением невырожденного примера.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

Не истери, при чём тут Applicative вообще. Ты изначально неправ, что оперируешь терминами «вычислительный контекст», «последовательность операций» и прочей пургой уровня Душкина и рувики. Определение монады _полностью_ содержится в сигнатурах методов и их законах.

В сигнатуре bind как-то отражено то, что одна функция должна вычисляться раньше другой? Нет. Что-то про «вычислительный контекст»? Нет.

fmdw
()
Ответ на: комментарий от fmdw

Не истери, при чём тут Applicative вообще.

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

qnikst ★★★★★
()
Ответ на: комментарий от fmdw

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

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

ты серьёзно не понял рассуждений или прикалываешься?

Если бы вычислялось значение типа a до WHNF в

(>>=) :: m a -> (a -> m b) -> m b

а не (m a), я бы с тобой согласился. А так не вижу никакого порядка вычислений в монаде.

Waterlaz ★★★★★
()
Ответ на: комментарий от qnikst

если ты не понял, почему это не подходящий контрпример, то мне тебя жаль.

Спешите видеть, ITT ниспровергают конструктивную логику!

(qnikst ду^Wнеправ) :: B

(если существует терм, являющийся монадическим вычислением, которое не форсирует порядок, qnikst неправ) :: A -> B

(print $ evalState (undefined >> return 265) undefined) :: A

modus ponens

QED.

Я построил тебе терм, обладающий нужным свойством и проходящий тайп-чек (в чём ты сам убедился). При этом для сама структура терма никому совершенно не интересна.

fmdw
()
Ответ на: комментарий от fmdw

Браво! Осталось показать, как в данном доказательстве используется то, что State является монадой, ведь (>>) это (*>) от аппликативного функтора, а апликативный функтор не вносит никаких ограничений на порядок.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

а апликативный функтор не вносит никаких ограничений на порядок.

Да и монада не вносит, тебе уже пять раз сказали.

fmdw
()
Ответ на: комментарий от qnikst

ведь (>>)

Если я напишу >>= \_ -> , тебе полегчает?

Ещё раз, в определении монады нет ни слова про WHNF. Это просто набор функций, для которых должны выполняться определённые законы в форме _уравнений_. Результат решения уравнения не зависит от порядка редукций (ок, в тьюринг-полном языке это не так, но тебя это не оправдывает).

fmdw
()
Ответ на: комментарий от fmdw

тем не менее, я не видел контр примера, который записывается при помощи monad и не записывается при помощи applicative. Как и контр примера, в котором не «часть действий может быть не выполнено в силу лени», а порядок монадических действий может меняться.

qnikst ★★★★★
()
Ответ на: комментарий от fmdw

Это один из способов. Множество функций должно образовывать моноид относительно композиции.

buddhist ★★★★★
()
Ответ на: комментарий от qnikst

t

примера, который записывается при помощи monad и не записывается при помощи applicative.

Предлагаю тебе продолжить этот спор с тайпчекером GHC.

fmdw
()
Ответ на: t от fmdw

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

qnikst ★★★★★
()
Ответ на: комментарий от fmdw

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

Если ты прав, то такой пример есть

UPD. лучше с join и не переизобретая (>>), (>>=) через него.

qnikst ★★★★★
()
Последнее исправление: qnikst (всего исправлений: 1)
Ответ на: комментарий от qnikst

например так:

test = runIdentity $ liftM2  plus (trace "1" (return 1)) (trace "2" (return 2))

plus a !b = b + a

и я бы успокоился и пошёл придумывать новый агрумент.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

Это потому что любая монада является аппликативным функтором.

P.S. Зачем приводить пример который ты сам тут же опровергаешь?

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

про P.S. я думал, что я нашёл подходящий для себя контр пример, но оказалось, что нет. Вообще дурацкий сбор.

Это потому что любая монада является аппликативным функтором.

но аппликативный функтор монадой не является, поэтому не все, что можно выразить с помощью монады можно выразить аппликативным функтором, моё утверждение заключается в том, что это «не все» это именно объединение операций в цепочку, т.е. задание последовательности, в общем как-то так.

qnikst ★★★★★
()
Ответ на: комментарий от Waterlaz

я бы с тобой согласился.

Напрасно, кстати. Потому как ленивость никто не отменял.

Miguel ★★★★★
()
Ответ на: комментарий от qnikst

Ты все таки молодец. В одиночку имеешь кучу фп-дрочеров, пытающихся отгородиться анально от императивщины. Ты, наверное, единственный на этом ресурсе, кто на самом деле понимает ФП.

terminator-101
() автор топика
Ответ на: комментарий от Waterlaz

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

qnikst ★★★★★
()
Ответ на: комментарий от terminator-101

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

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

я не единственный на этом ресурсе понимающий фп

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

terminator-101
() автор топика
Ответ на: комментарий от anonymous

Невозможно реализовать хаскель на самом хаскеле — метациклический исполнитель.

Да ну? В рамках монады IO вполне всё реализуется (хотя записью машкодов, хоть интерпретацией).

monk ★★★★★
()
Ответ на: комментарий от anonymous

в рамках другого языка.

С чего это? Монада IO является частью языка Haskell. Ну или будь последователен и реализуй лисп на CL без потоков ввода-вывода. Они ведь тоже внешняя сущность по отношению к лиспу.

monk ★★★★★
()
Ответ на: комментарий от qnikst

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

До рпг-треда.

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

Ваши действия:

1) Отбросить математическую природу монад, их имплементацию в haskell и выдать свою гипотезу за определение.

2) Герой понимает, что его гипотеза — всего лишь гипотеза и нуждается в доказательстве. [вписать доказательство]

3) Просить бандитов доказать ложность гипотезы. [требуется: харизма > 3, упоротость > 5]

4) Тактическое отступление

5) Стандартно

fmdw
()
Ответ на: комментарий от fmdw

Ты, как я понял, утверждаешь, что роль монад не сводится к контролю вычислений, а имеют самостоятельную «семантическую» роль. В таком случае, ты наверняка сможешь объяснить, почему в языках с энергичным порядком вычислений их нет. Все слушают внимательно.

terminator-101
() автор топика

1) fexprs. Имеют полный контроль над вычислениями.

3) monads. То же самое, что п. 2, за исключением того, что в теле функции невозможно получить само выражение аргумент, «как он есть», а лишь его вычисленное значение.

Ни монады, ни фекспры НЕ ИМЕЮТ никакого контроля над вычислениями.

Макросы имеют - позволяют переносить вычисления в компайлтайм.

anonymous
()
Ответ на: комментарий от qnikst

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

terminator-101
() автор топика
Ответ на: комментарий от qnikst

монады гарантируют порядок вычисления до WHNF.

Ничег оони не гарантируют. Монады биндом склеивают ИО-терм, а как он будет вычисляться - это уже МАМОЙ КЛЯНУСЬ разработчика компилятора.

anonymous
()
Ответ на: комментарий от qnikst

Как ты видишь из типа, для того, чтобы выполнить действие a -> m b нам необходим результат из a

Никаких действий не выполняется, бинд просто «приклеивает» одно вычисление к другому и возвращает результат. Но не выполняет их.

anonymous
()
Ответ на: комментарий от qnikst

В любом из этих контекстов монадическая структура задает порядок.

Не задает. Это то же самое что утверждать, будто функция «+» задает порядок.

anonymous
()
Ответ на: комментарий от qnikst

m вычислится до WHNF до f.

С чего ты взял? Наоборот, вообще-то, f будет вычислено первым: (f a) - сперва будет вычислено f, и только потом уже а (если а вообще будет вычислено).

anonymous
()
Ответ на: комментарий от terminator-101

Таблетки поциент давно принимал, уже совсем поплыл. Надо срочно добивать!

anonymous
()
Ответ на: комментарий от monk

С чего это? Монада IO является частью языка Haskell.

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.