
Yuriy
16.09.2017
12:03:06
мне кажется, что можно формализовать для какой-нибудь «процедурной машины Тьюринга»
например, как любое изменение в ленте за пределами ячеек, предназначенных для возврата результата

Евгений
16.09.2017
12:03:47

Google

Евгений
16.09.2017
12:04:34
Так что формализация через тьюринг-машины это убегание от ответа

Yuriy
16.09.2017
12:05:04
я хотел сказать, что побочных эффектов нет в типах
в типах может быть только "кодировка побочных эффектов", как в Хаскелле и других чистых языках

Евгений
16.09.2017
12:05:36
Что значит "нет в типах"?

Yuriy
16.09.2017
12:07:05

Евгений
16.09.2017
12:07:59
В хаскеле и клине есть кодировка строгих вычислений (в виде монад или линейных типов), а не побочных эффектов

Abbath
16.09.2017
12:08:20
Монады - ленивые :)

Евгений
16.09.2017
12:09:09
Монады - ленивые :)
А корутины -- энергичные :) Но тем не менее это способ эмуляции другой стратегии редукции

Yuriy
16.09.2017
12:09:26

Ilya
16.09.2017
12:12:10

Google

Ilya
16.09.2017
12:13:02
там просто IO Int и всё, разве нет?

Yuriy
16.09.2017
12:13:03

Ilya
16.09.2017
12:13:08
всегда "одинаковое"
а уж как это IO Int выведется на какой-то "экран" или запишется в какой-то "файл", это не имеет отношения к самому исчислению

Index
16.09.2017
12:13:43
Я не понимаю претензию к терминологии. Нормальная концепция возвращаемого значения, вполне применима, если рассматривать редукцию тёрмов.

Ilya
16.09.2017
12:13:45
я так представляю в общем

Index
16.09.2017
12:14:40
"Передать аргумент" — сделать function application, потом выполняем редукцию, оставшийся тёрм — "возвращаемое значение".
Все-таки функция это вообще отображение одного множества на другое, так что и про редукцию говорить можно только в рамках конкретной модели.

Yuriy
16.09.2017
12:15:56
побочные эффекты придумали функциональщики, чтобы объяснить императивщикам, чем они занимаются

Евгений
16.09.2017
12:15:57
там просто IO Int и всё, разве нет?
Значения типа IO Int это не 10, 15, 1768, а функции f, g, h, где f, g, h имеют тип (Realworld -> Realworld, Int)

Ilya
16.09.2017
12:16:33

Index
16.09.2017
12:16:33
> (Realworld -> Realworld, Int)
Какой-то неправильный тип

Ilya
16.09.2017
12:16:41
она не зависит от каких-то состояний

illiatshurotshka❄️
16.09.2017
12:16:47
unsafePerformIO
?

Ilya
16.09.2017
12:17:39

Index
16.09.2017
12:18:02
И вообще модель IO a как функции RealWorld -> (a, RealWorld) я никогда не понимал, ведь мне в такой модели ничто не помешает к одному RealWorld применить разные функции, что нонсенс.
Нормально это моделируется только с линейными типами, в Merucry красиво сделали

Yuriy
16.09.2017
12:19:49
См выше
не понял, уточни направление, пожалуйста

Google

kana
16.09.2017
12:19:56
Я как-то задавал вопрос про РилВорлд, мне никто не ответил про него ничего. Я так понимаю, это какой-то кусок памяти, изменение которого сразу отражается на реальном мире (файловая система например). То есть именно РилВорлд является хаком, а не IO

Ilya
16.09.2017
12:21:29
начнём с того, что ST является хаком?

Yuriy
16.09.2017
12:21:46
RealWorld не память, это вообще ничего. все действия с ним сводятся к вызову процедур, определённых вне Хаскелла

Index
16.09.2017
12:22:16
RealWorld это фантомный тег для создания data dependency
А на самом деле при редукции термов в Haskell могут быть сайд-эффекты, выполняемые RTS
И этот RealWorld позволяет порядок там навести небольшой
unsafePerformIO просто забивает на RealWorld

kana
16.09.2017
12:24:10
Я к тому, что можно ли делать сайд-эффекты без IO? То есть можно ли на хаскеле написать свою систему для сайд-эффектов без IO-монады

Index
16.09.2017
12:26:25
Можно
Есть набор примитивов, у которых во внутренностях GHC проставлено, что они могут вызывать прерывания процессора и делать сайд-эффекты. Их перечень захардкожен. Оптимизатор аккуратно не перемещает их никуда (там два принципа перемещения, float in и float out), чтобы гарантировать, что ничто два раза не вызывается. RealWorld применяется, чтобы в правильном порядке вызывались (создавая искуственно data dependency).
Можно взять эти примитивы и свою систему эффектов сделать.
Все-таки IO это библиотечный тип, а не примитив

Евгений
16.09.2017
12:28:41
А ST примитив?

Index
16.09.2017
12:29:02
Нет
ST это тот же тип, что IO, только вместо RealWorld там forall s. s, и имеем от этого runST

Ilya
16.09.2017
12:29:58
понять бы ещё, как эта runST работает

Index
16.09.2017
12:30:30
Никак, это no-op чтобы гарантировать, что ты не пытаешься ST-переменные за пределами ST использовать
ST гарантирует referential transparency за счет того, что переменные локальны

Ilya
16.09.2017
12:31:18
но всё-таки интересно, откуда она это начальное состояние берёт
или на самом деле она ничего не берёт

Google

Ilya
16.09.2017
12:31:28
и это большой обман

Index
16.09.2017
12:31:34
Он его не берет, переменная s никогда не инстанцируется

Yuriy
16.09.2017
12:33:12
когда я писал «примитив», имел в виду процедуры readIORef и writeSTRef, а не типы ST или IO
s не обман, она честно не используется
то есть её значение

Index
16.09.2017
12:35:23
У нее нет значения

Ilya
16.09.2017
12:43:21
интересно. то есть получается, что не все допустимые функции могут быть написаны на haskell, однако это не мешает нам их использовать, потому что из самой сигнатуры (forall s. ST s a) -> a следует, что такая функция единственна, а значит и "знать" нам её не обязательно
а ещё такие функции есть?
тело которых нельзя записать на языке редукции выражений

Alexander
16.09.2017
12:43:42

Ilya
16.09.2017
12:43:57
но которые можно юзать, и это будет непротиворечиво

Index
16.09.2017
12:44:00

Ilya
16.09.2017
12:44:12
ну как бы выглядео тело такой функции?

Index
16.09.2017
12:44:22
Возьми и посмотри исходник

Ilya
16.09.2017
12:44:53
ок

Alexander
16.09.2017
12:46:11

Ilya
16.09.2017
12:46:54
почему?
наверное я не прав. просто так читал в какой-то книжке, типа нач. значение берётся из ниоткуда

Alexander
16.09.2017
12:46:58

Index
16.09.2017
12:47:13
Кстати, надо бы и мне смотреть повнимательнее. Судя по runRW#, все-таки s инстанцируется внутри, как RealWorld.

Google

Alexander
16.09.2017
12:48:23
оно размера 0

Index
16.09.2017
12:48:24
Так что ST еще больше похож на IO, чем я думал.

Alexander
16.09.2017
12:48:39
дальше оптимизации
В смысле что похож на ио, если ио это и есть ст

Index
16.09.2017
12:50:38
Я думал что IO это ST, где s принимается за RealWorld
а оказывается и в самом ST тоже RealWorld
Соответственно разница еще меньше

Alexander
16.09.2017
12:52:21
как это в ст Real world?

Index
16.09.2017
12:52:46
Ну вон там runRW# в определении runST

Ilya
16.09.2017
12:53:12
так, теперь надо в GHC.Magic лезть

Index
16.09.2017
12:53:24

illiatshurotshka❄️
16.09.2017
12:54:57
# это просто название идентифаера?

Index
16.09.2017
12:55:03
Да

Alexander
16.09.2017
12:55:48
действительно
@anarchostatist обычно добавляют к функциям работающим с данными кайнда #
unboxed

Index
16.09.2017
12:56:35
Этого кайнда больше нет, но традиция осталась

illiatshurotshka❄️
16.09.2017
12:57:06
лол ?

Vyacheslav
16.09.2017
12:57:08
у меня практический вопрос, пишу обвязку вокруг api.ai
{
"id": "702fcc70-aa52-4ea0-8e78-3d040e56d221",
"timestamp": "2017-09-16T12:38:33.477Z",
"lang": "ru",
"result": {
"source": "agent",
"resolvedQuery": "давай завтра",
"action": "create_task",
"actionIncomplete": false,
"parameters": {
"date": "2017-09-17",
"time": ""
},
"contexts": [],
"metadata": {
"intentId": "3dc678bb-900f-4323-9eb0-5e8342207647",
"webhookUsed": "false",
"webhookForSlotFillingUsed": "false",
"intentName": "create_task"
},
"fulfillment": {
"speech": "Сделал задачу",
"messages": [
{
"type": 0,
"speech": "Сделал задачу"
}
]
},
"score": 1
},
"status": {
"code": 200,
"errorType": "success"
},
"sessionId": "fe8a36c0-6780-435a-84bd-59d9a052e3cd"
}
заранее я не знаю какой мне ответ придет, потому что он зависит от запроса