Критика монади IO розглядається як державна монада, що діє на світ


46

IOМонада в Haskell часто пояснюється як державної монади , де держава є світ. Таким чином, значення IO aмонади типу розглядається як щось подібне worldState -> (a, worldState).

Деякий час тому я прочитав статтю (або повідомлення в блозі / списку розсилки), в якому критикував цю точку зору і наводив кілька причин, чому це не правильно. Але я не пам'ятаю ні статті, ні причин. Хтось знає?

Редагувати: Стаття здається втраченою, тому почнемо тут збирати різні аргументи. Я починаю щедро робити цікавіші речі.

Редагувати: Стаття, яку я шукав, - це вирішення незручного загону: монадійний введення / вихід, одночасність, винятки та дзвінки на іноземній мові в Haskell Саймона Пейтона Джонса. (Завдяки відповіді TacTics.)



@JoachimSauer Спасибі, це також цікава стаття, але це не та, яку я шукаю. Ця була зосереджена на парадигмі світового світу.
Петро Пудлак

З верхньої частини моєї голови, коментарі тут хороший старт
Адам

1
Що означає "світ" у цьому контексті? Я припускаю, що це не означає "Земля". Це якась глобальна сфера? Автор, який це написав, продає себе коротко. Якщо він хоче одночасно плутати і стискати егої своїх читачів, йому слід назвати це "Держава - Всесвіт" або "Держава Бог". Світ. Ах! Ви, молоді, не прагнете досить високо!
GlenPeterson

Відповіді:


33

Проблема IO a = worldState -> (a, worldState)полягає в тому, що якби це було правдою, то ми могли б довести це forever (putStrLn "Hello") :: IO aі undefined :: IO aрівні. Ось доказ люб'язності доліо (2010, irc):

forever m
 =
m >> forever m
 =
fix (\r -> m >> r)
 = {definition of >> for worldState -> (a, worldState)}
fix (\r -> \w -> r (snd $ m w))

Лема: (\r w -> r (snd $ m w)) ⊥ = ⊥

(\r w -> r (snd $ m w)) ⊥
  =
\w -> ⊥ (snd $ m w))
  =
⊥ . snd . m
  =
⊥

Тому forever m = fix (\r -> \w -> r (snd $ m w)) = ⊥

Зокрема, forever (putStrLn "Hello") = ⊥а отже, forever (putStrLn "Hello")і undefinedрівнозначні програми. Однак, очевидно, вони не повинні вважатися рівнозначними програмами, ні теоретично, ні на практиці.

Зауважте, що ця модель помилкова навіть без посилань на одночасність.


7
Хтось здивований, що програма, що не знищує, рівнозначна undefinedв чистій семантиці Хаскелла? В чистій семантиці Хаскелла, судячи з усього, різниться ⊥! Але коли ми оперативно думаємо про наші програми, ми хочемо виділити різні види ⊥, навіть коли IOвони не беруть участь; Мені байдуже, кидає моя програма виняток або входить у нескінченний цикл, навіть якщо ви можете довести, що вони рівні, довівши, що вони обидва ⊥. Це насправді не суперечність.
Бен

3
Позначення ⊥ та [0,1 ..] є чіткими, хоча вони обидва "не закінчуються". Різниця полягає в тому, що d позначає неприпинені та невиробничі обчислення, тоді як [0,1 ..] є нестатевим, але продуктивним. Ми очікуємо, що (назавжди (putStrLn "Привіт")) матиме аналогічне незакінчене, але продуктивне позначення.
Рассел О'Коннор

1
Але forever (putStrLn "Hello")не так [0,1..], звичайно. Ваше доказ не стосується worldState, тому воно також стосується звичайної монади держави. Так forever (someModificationWith "Hello")само денотаційно еквівалентно ⊥. Я абсолютно не здивований цим результатом; це не є результативним у денотаційній семантиці, і те, що комп'ютер працює оперативно, поки ми чекаємо вічно, не має значення. Те саме для forever (putStrLn "Hello"); це не може і не повинно створювати нову світову державу, яку ми можемо якось ліниво споживати.
Бен

Чи є такі мови програмування, як Меркурій та Чистий, які використовують явну передачу світової держави для надання декларативної моделі для IO в принципі помилковими?
Бен

@Ben ви маєте на увазі, як працює проходження світу з одночасністю? Ви бачили код розетки для одночасності Меркурія? Я задумався, що це означає і семантично.
CMCDragonkai

12

Ось банальна відповідь: будь-яка зміна стану монади держави пов'язана з будь-якими діями, здійсненими в монаді. Якщо дійсно пояснення "WorldState -> (a, WorldState)" вимагає тієї ж властивості, причому WorldState є чистою цінністю, що змінюється лише монада IO, це неправильно. Зміни часу, вміст файлів, стан ручок тощо можуть змінюватися незалежно від того, що відбувається в монаді IO. У цьому суть монади IO. Той факт, що GHC переходить навколо значення RealWorld (або ж, коли це було) під ним, - це гарантувати, що все буде впорядковано в порядку, наскільки я знаю, якщо це (можливо, можна щось поставити у значення ST).


8
це насправді не проблема. ви можете змоделювати операцію зв'язування як виконану модифікацію світового стану, отриману з деякого фіксованого, але непізнаваного сховища правил.
sclv

1
@sclv: так, але цей фіксований, але невідомий магазин правил - це диференціюючий фактор, який робить IO не монадою штату, ця невідповідність не знайдена в монаді штату
Джиммі Хоффа

Аргумент, який я чув проти держави WorldState, пов'язаний з одночасністю, хоча я не можу згадати точний аргумент. Але навіть все-таки я припускаю, що WorldState також може кодувати майбутнє в ньому, тому я все ще не бачу проблеми. Звичайно, я припускаю, що мені чогось не вистачає.
Томас Едінг

@JimmyHoffa: Ти можеш нести навколо магазину правил у штаті.
sclv

1
@JimmyHoffa: це мета абстракції. Крім того, щоб продовжити мої первісні коментарі, Очистіть моделі IO як чітко та щасливо, що проходять у світі, використовуючи унікальні типи, щоб не обманювати та «дублювати» світ. Це один із способів забезпечення абстракції.
sclv

12

Я написав допис у блозі на тему, як моделювати IO як форму асиметричної кореневища, що спілкується із системою виконання для вашої мови. (Це правда, третя частина серії)

http://comonad.com/reader/2011/free-monads-for-less-3/

Цей пост висвітлює трохи того, чому незрозуміло міркувати про семантику «миротворчих».


+1 - особливо цікаво, оскільки я давно планував реалізувати IO мови, яку я розробляю, аналогічно цій! :)
Жуль

8

Див. Розбір протиграшного загону .

Найбільшою причиною є те, що в RealWorld державні моделі МО монади не дуже добре працюють з одночасністю. SPJ у цій читаній класиці надає перевагу використанню оперативної семантики для її розуміння.


Я вважаю, що це оригінальна стаття, яку я шукав, в основному розділ 3.1. Якби ви опублікували її до того, як я відредагував це питання, я би прийняв вашу відповідь, але зараз я вважаю, що буде більш справедливо почекати до кінця, щоб побачити всі ідеї, які опублікують інші.
Петро Пудлак

5

Основна скарга на моделі держав RealWorld полягає в тому, що, як стверджує TacTics, прохідний світ не обов'язково працює з одночасністю. Але Вутер Свіерстра та Торстен Альтенкірх показали, як міркувати про сумісність як про ефект, що проходить у світі, з фіксованою, але довільною послідовністю переплетення ниток у своїй роботі "Краса в звірі: функціональна сематика для невдалого загону": http : //www.staff.science.uu.nl/~swier004/Publications/BeautyInTheBeast.pdf

Код, відповідний цьому, знаходиться на Hackage як IOSpec: http://hackage.haskell.org/package/IOSpec

Я думаю, теза Вутера детальніше описується: http://www.staff.science.uu.nl/~swier004/Publications/Thesis.pdf

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.