
Pineapple
07.04.2018
18:24:13
Если А употребляется строго, то его вполне может распаковать

A64m
07.04.2018
18:24:14
и все кейсы он никогда не видит, полнопрограммного анализа нет
может, если функция возвращает A то оптимизировать в передачу на стеке, но я бы на такое не расчитывал

Pineapple
07.04.2018
18:25:48
Ну GHC вполне может распаковать А внутри функции.

Google

Ilya
07.04.2018
18:25:51

A64m
07.04.2018
18:25:58
внутри может

Ilya
07.04.2018
18:27:02
на самом деле может
просто я на это как раз и наткнулся:)
что нету разницы между data и newtype, если всё в пределах одного модуля, и data ведёт себя как newtype

A64m
07.04.2018
18:27:48
есть оптимизации которые устранят конструктор и оставят передачу примитивов, но это не замена на ньютайп

Ilya
07.04.2018
18:27:52
но если вынести data в отдельный файл, и оттуда импортировать, то разница появляется

Pineapple
07.04.2018
18:30:06
Мне казалось, что GHC имеет полный доступ ко всем внутреннастям значения, вне зависимотсти от того, где оно объявлено. А вот функии могу не инланйится

Ilya
07.04.2018
18:30:28
короч это простая учебная задачка на strict и lazy, и по задумке автора прога должна вылетать с out of memory, пока мы не заменим data на newtype, после чего всё в шоколаде
но умный GHC работает с data как с newtype
в итоге приходится повозиться, чтобы наконец-то увидеть нужную разницу

Google

Ilya
07.04.2018
18:31:21
либо запускать в интерпретаторе, либо выносить data в отдельный файл

A64m
07.04.2018
18:31:30
ок, значит это
и это оптимизация для конкретной функции, т.е. ghc в принципе старается из какой-то комбинации комбинаторов сделать оборачиватель, который матчит мконструкторы и потом заворачивает результаты и работник. который оперирует с по возможности распакованными примитивами

Ilya
07.04.2018
18:32:01
а, wrapper и worker
читал про это
спасибо

A64m
07.04.2018
18:33:37
идентити-то нету, так что можно выпотрошить все лифтнутые объекты из кучи, что-то там делать с супом из примитивов и на выходе обратно их во то-то лифтнутое упаковать
без этого та же арифметика была бы в 10 раз тормознее
но оптимизатор не меняет типы
(не считая анпака небольших строгих полей)
он на основе анализа строгости может сделать функцию строгой, но не конструктор, даже если теоретически эта ленивость нигде не нужна

Alexander
07.04.2018
20:07:15
так уже эту оптимизацию обсудили

Yuriy
08.04.2018
06:53:28
а если StrictData включить?

Alexander
08.04.2018
07:15:03
кстати, а почему для хаскеля выбрали Hask а не Set?
Есть какой то реальный профит от этого, или просто исторически?

Dmitry
08.04.2018
07:25:10
Вроде все возможные типы шире, чем Set.
Наверное :)

Alexander
08.04.2018
07:26:20
ну шире чем set это ты загнул
разница там только в наличии bottom же

Dmitry
08.04.2018
07:29:42
Да, ступил :)
Ну, ждём ответов от гуру :)

Google

Leonid
08.04.2018
07:39:10

Alexander
08.04.2018
07:39:33
ну зачем в haskell добавили bottom?
если я правильно понимаю, по хорошему надо выпиливать либо bottom либо seq (вместе с упарвлением ленивостью), чтобы получилась категория

Слава
08.04.2018
07:46:26
Потому что без bottom не получится Тьюринг-полного языка.

Alexander
08.04.2018
07:47:43
можешь формализовать это утверждение?
я уверен что могу написать без использования bottom интерпретатор машины тьюринга с бесконечной лентой

Dmitry
08.04.2018
07:49:28
А исключения (ошибки) как представлять в типах?

Alexander
08.04.2018
07:50:20
Maybe / Either / Except

Слава
08.04.2018
07:50:44
Не могу. Знаю о существовании тотальных языков без bottom, знаю также, что на них не пишет никто, кроме исследователей, потому что невозможно

Alexander
08.04.2018
07:52:12
если в хаскеле зафорсить обязательный otherwise в паттерн-матчинге, какие еще примитивы (error в расчет не берем, его можно сделать на монадах) будут требовать наличие bottom?

Слава
08.04.2018
07:52:22
То есть, это аргумент вида "если до сих пор так не делают, стало быть, есть причина".

kana
08.04.2018
08:12:32

Alexander
08.04.2018
08:12:56
вот черт

kana
08.04.2018
08:13:27
Нужно проверять функции на тотальность, что невозможно
Да и смысла нет в хаскеле

Ilya
08.04.2018
08:14:21

Alexander
08.04.2018
08:14:25
let f = f in f
вместо bottom зависло

kana
08.04.2018
08:14:39

Alexander
08.04.2018
08:15:04
не, bottom это
Prelude> undefined
*** Exception: Prelude.undefined

Ilya
08.04.2018
08:15:05
В мире типов нет зависания

Google

kana
08.04.2018
08:15:38

Alexander
08.04.2018
08:19:04
вот же дерьмо
окей, я понял
Prelude> let undefined = undefined in undefined . id `seq` ()
()
Prelude> let undefined = undefined in undefined `seq` ()
^CInterrupted.грустно это

Евгений
08.04.2018
08:27:24

Oleg
08.04.2018
08:30:14

Yuriy
08.04.2018
08:40:18

Alexander
08.04.2018
08:41:03
Ну типа это нарушает свойства категории

Admin
ERROR: S client not available

Евгений
08.04.2018
08:45:09
Hask > Set
На категориях нет порядка. Ну и наверное человек спрашивает про категорию Set, а не про универсум типов, так что это не совсем верно. Из н в н есть много нерекурсивных функций

Oleg
08.04.2018
08:49:07

Alexander
08.04.2018
09:06:17
В смысле объектов
А функторов из или в hask не бывает, так как hask не элемент Cat

Daniel
08.04.2018
09:12:55

Alexander
08.04.2018
09:14:45
Плюс его нельзя считать категорией, так что структура мимо

Oleg
08.04.2018
09:30:04

Google

Oleg
08.04.2018
09:35:54
Хотя бы лемму Йонеды перечитайте

A64m
08.04.2018
09:37:42

Oleg
08.04.2018
09:42:29

Yuriy
08.04.2018
09:44:57
и что тогда?
тогда семантика будет такая же, и можно data оптимизировать до newtype

Aleksey
08.04.2018
10:05:34
В эльме обнаружилось ещё одное "прекрасное":
type Foo = String
у нас бы это было определение
data Foo = String
И в Elm такое даже компилится, но не работает, естетственно, т.к. конструкторов значений нет

A64m
08.04.2018
10:19:10

kana
08.04.2018
11:16:07

Aleksey
08.04.2018
11:16:20
Нет
Тип

kana
08.04.2018
11:17:38

Aleksey
08.04.2018
11:18:25
Хмм. Т.е. таки конструктор String создается?

kana
08.04.2018
11:18:34
ну да, как и в хаскеле
это же термлевел и тайплевел

Aleksey
08.04.2018
11:19:01
Да, чёт попутал :)
Я сам такое не писал, а вот сегодня наткнулся на такой пример и подумал, что в Эльме опять что-то недокомпиляторили :) Это такой рефлекс уже :)

Антон
08.04.2018
13:37:13

A64m
08.04.2018
13:38:55
не так и сложно, на самом деле. прилично компилировать по возможности раздельно сложнее. просто и сейчас много кто временем компиляции недовольны, что начнется, если она раз в сто больше будет?

Ilya
08.04.2018
14:05:02
А функциями вроде performGC часто пользуются в реальных программах?

Антон
08.04.2018
14:06:03

A64m
08.04.2018
14:07:01
нет
(ну, для бенчмарков используются)

Alexander
08.04.2018
14:18:55