Евгений
считается ли возвращение _|_ сайд эффектом?
Не является, в любом тьюринг-полном языке с рекурсивными типами любой тип населён абсурдными элементами.
Боттом фиксированное название одного из них, таких дохуя в каждом типе
Ilya
Кстати, а что за кайнд (* -> *) -> * ?
Ilya
Можно пример такого типа?
Влод
не совсем то
Влод
data Free f a = Pure a | Free (f (Free f a))
Влод
(ну просто оно запомнилось применением своего аргумента, наверное есть и проще примеры)
Влод
Fix f = f (Fix f)
Влод
видимо то что нужно
Влод
newtype Fix f = Fix { unFix :: f (Fix f) } deriving (Generic, Typeable)
Ilya
хм, интересно:)
Ilya
про функцию fix я читал, а вот про тип нет
Alexander
data Q f = forall a. Q (f a)
Влод
Alexander
сам написал, меня попросили я написал
Влод
аа
Alexander
после знака равно может быть что угодно главное что f кайнда *->*, т.е. принимает тип и возвращает тип, который может быть значением
Alexander
именно этот вариант не очень осмысленный, но можно придумать и осмысленный
Alexander
у фикс как написано выше будет (*->*)->*->*
Влод
просто применение таких штук сложновато представить
Alexander
и.е. это не то
Ilya
здесь forall это экзистенциальный тип?
Vasiliy
вполне можно представить себе применение
Alexander
ну да можно убрать и написать Q (f Int)
Alexander
= Q (f Int)
Alexander
ну если его до ко-йонеды довести но будут
Vasiliy
data User f = User { userName :: f String }
Влод
Alexander
или классов типов добавить
Alexander
вот да про юзера лучше
Vasiliy
User Identity - валидный, User (Either Err) - результат валидации
Alexander
data Fix f a
Alexander
не?
Alexander
а блин туплю
Alexander
норм
Alexander
там Free f a а Fix от ненр
Anonymous
Влод
да определенно тут периодически всплывает что бесконечная рекурсия и андефайнед - сай эффекты
Влод
Anonymous
ну _|_ ломает referential transparency если я правильно понимаю
Alexander
пример
Alexander
(не ломает)
Евгений
Кстати, как формализовать понятие "сайд-эффекта"? Как я не бьюсь, у меня получается, что сайд-эффектов нет, есть неправильная типизация
Cheese
кана
E x. f x ≠ f x ?
Cheese
E x. f x ≠ f x ?
это недетерминированность, она перпендикулярна побочным эффектам
Евгений
Т.е. это неправильная типизация
кана
Если функция возвращает разные значения, значит она зависит от чего-то, что изменяется, значит есть сайдэффект
Евгений
Что значит "вохвращаемые значения"? Процедурная чушь какая-то. Нет возвоащаемых значений, есть редукция терма (f x)
Евгений
Только в строгих стратегиях редукции (f x) в не зависимости от контекста редуцируется одинаково
Cheese
Cheese
мне кажется, что можно формализовать для какой-нибудь «процедурной машины Тьюринга»
Cheese
например, как любое изменение в ленте за пределами ячеек, предназначенных для возврата результата
Евгений
Евгений
Так что формализация через тьюринг-машины это убегание от ответа
Cheese
Cheese
я хотел сказать, что побочных эффектов нет в типах
Cheese
в типах может быть только "кодировка побочных эффектов", как в Хаскелле и других чистых языках
Евгений
Что значит "нет в типах"?
Евгений
Cheese
Евгений
В хаскеле и клине есть кодировка строгих вычислений (в виде монад или линейных типов), а не побочных эффектов
a66ath
Монады - ленивые :)
Евгений
Монады - ленивые :)
А корутины -- энергичные :) Но тем не менее это способ эмуляции другой стратегии редукции
Cheese
Ilya
Ilya
там просто IO Int и всё, разве нет?
Cheese
Ilya
всегда "одинаковое"
Ilya
а уж как это IO Int выведется на какой-то "экран" или запишется в какой-то "файл", это не имеет отношения к самому исчислению
Vladislav
Я не понимаю претензию к терминологии. Нормальная концепция возвращаемого значения, вполне применима, если рассматривать редукцию тёрмов.
Ilya
я так представляю в общем
Vladislav
"Передать аргумент" — сделать function application, потом выполняем редукцию, оставшийся тёрм — "возвращаемое значение".
Vladislav
Все-таки функция это вообще отображение одного множества на другое, так что и про редукцию говорить можно только в рамках конкретной модели.
Cheese
побочные эффекты придумали функциональщики, чтобы объяснить императивщикам, чем они занимаются
Евгений
там просто IO Int и всё, разве нет?
Значения типа IO Int это не 10, 15, 1768, а функции f, g, h, где f, g, h имеют тип (Realworld -> Realworld, Int)
Евгений