Denis
Кто там линуксовый кошелёк ждал?
Denis
https://twitter.com/dshevchenko_biz/status/982356376436396032
Denis
Ignat
НАКАНЕЦТА
parket
Что за валюта? Почему все так радуются?
Ignat
Ada же
parket
Чем Ada интересно? :)
Cheese
Хаскелем
IC
Ada же
Сказал человек с именем iGNAT 😁
Слава
Там не та Ада
Ignat
И слава б-гу!
Ilya
GHC умеет оптимизировать data A = A Int в newtype A = A int?
Алексей
Нет, потому что у них разная семантика
Ilya
я не говорю про общий случай
Алексей
data A : A ⊥ ≠ ⊥ newtype A: A ⊥ = ⊥
Ilya
но в рамках одной мини-проги, где сразу объявляется и сам data, и main
Ilya
т.е. он может видеть все кейсы использования этого data
Ilya
почему не соптимизировать?
A64m
да не важно где он объявляется
Алексей
Если А употребляется строго, то его вполне может распаковать
A64m
и все кейсы он никогда не видит, полнопрограммного анализа нет
A64m
может, если функция возвращает A то оптимизировать в передачу на стеке, но я бы на такое не расчитывал
Алексей
Ну GHC вполне может распаковать А внутри функции.
Ilya
и все кейсы он никогда не видит, полнопрограммного анализа нет
почему не видит, если у него всё перед глазами?
A64m
внутри может
Ilya
на самом деле может
Ilya
просто я на это как раз и наткнулся:)
Ilya
что нету разницы между data и newtype, если всё в пределах одного модуля, и data ведёт себя как newtype
A64m
есть оптимизации которые устранят конструктор и оставят передачу примитивов, но это не замена на ньютайп
Ilya
но если вынести data в отдельный файл, и оттуда импортировать, то разница появляется
Алексей
Мне казалось, что GHC имеет полный доступ ко всем внутреннастям значения, вне зависимотсти от того, где оно объявлено. А вот функии могу не инланйится
Ilya
короч это простая учебная задачка на strict и lazy, и по задумке автора прога должна вылетать с out of memory, пока мы не заменим data на newtype, после чего всё в шоколаде
Ilya
но умный GHC работает с data как с newtype
Ilya
в итоге приходится повозиться, чтобы наконец-то увидеть нужную разницу
Ilya
либо запускать в интерпретаторе, либо выносить data в отдельный файл
A64m
ок, значит это
и это оптимизация для конкретной функции, т.е. ghc в принципе старается из какой-то комбинации комбинаторов сделать оборачиватель, который матчит мконструкторы и потом заворачивает результаты и работник. который оперирует с по возможности распакованными примитивами
Ilya
а, wrapper и worker
Ilya
читал про это
Ilya
спасибо
A64m
идентити-то нету, так что можно выпотрошить все лифтнутые объекты из кучи, что-то там делать с супом из примитивов и на выходе обратно их во то-то лифтнутое упаковать
A64m
без этого та же арифметика была бы в 10 раз тормознее
A64m
но оптимизатор не меняет типы
A64m
(не считая анпака небольших строгих полей)
A64m
он на основе анализа строгости может сделать функцию строгой, но не конструктор, даже если теоретически эта ленивость нигде не нужна
Alexander
но в рамках одной мини-проги, где сразу объявляется и сам data, и main
в одном модуле если то конструктор может соптимизироваться, но это большое исключение. А и.к. меняется семантика то компилятор не может делать такие оптимизации
Alexander
так уже эту оптимизацию обсудили
Cheese
а если StrictData включить?
Alexander
кстати, а почему для хаскеля выбрали Hask а не Set? Есть какой то реальный профит от этого, или просто исторически?
Dmitry
Вроде все возможные типы шире, чем Set.
Dmitry
Наверное :)
Alexander
ну шире чем set это ты загнул
Alexander
разница там только в наличии bottom же
Dmitry
Да, ступил :)
Dmitry
Ну, ждём ответов от гуру :)
Alexander
ну зачем в haskell добавили bottom?
Alexander
если я правильно понимаю, по хорошему надо выпиливать либо bottom либо seq (вместе с упарвлением ленивостью), чтобы получилась категория
Слава
Потому что без bottom не получится Тьюринг-полного языка.
Alexander
можешь формализовать это утверждение?
Alexander
я уверен что могу написать без использования bottom интерпретатор машины тьюринга с бесконечной лентой
Dmitry
А исключения (ошибки) как представлять в типах?
Alexander
Maybe / Either / Except
Слава
Не могу. Знаю о существовании тотальных языков без bottom, знаю также, что на них не пишет никто, кроме исследователей, потому что невозможно
Alexander
если в хаскеле зафорсить обязательный otherwise в паттерн-матчинге, какие еще примитивы (error в расчет не берем, его можно сделать на монадах) будут требовать наличие bottom?
Слава
То есть, это аргумент вида "если до сих пор так не делают, стало быть, есть причина".
кана
Maybe / Either / Except
f = f Вот и боттом словили
Alexander
вот черт
кана
Нужно проверять функции на тотальность, что невозможно Да и смысла нет в хаскеле
Alexander
let f = f in f вместо bottom зависло
кана
Alexander
не, bottom это Prelude> undefined *** Exception: Prelude.undefined
Ilya
let f = f in f вместо bottom зависло
Просто у тебя компьютер работает не с бесконечной скоростью, смирись
Ilya
В мире типов нет зависания
кана
не, bottom это Prelude> undefined *** Exception: Prelude.undefined
Это еррор, который мгновенный В нашем случае боттом это незавершемое вычисление Еррор это тоже незавершемое вычисляется
Alexander
вот же дерьмо
Alexander
окей, я понял