A64m
модель слишком сложная, в голову целиком плохо помещалась. он расчитывал на автоматику, и, видимо, использовал какой-то из ныне дохлых проектов. но автоматика не справилась тоже
сомнительно, эти дохлые проекты видели по паре человек во всяких универах, а в ghc до конца двухтысячных SMP вообще не было, не то что автоматического
Daniel
ну так он и был из немецкого и американского университетов
Daniel
да и сейчас есть, просто модель заглохла (но докторскую он на ней защитил)
Anatolii
ого, саксес стори хаскеля
Daniel
вот да. оттуда я вынес представление о хаскеле как о языке для академических ученых. потому как с прикладной областью не сложилось
A64m
это в какие годы было-то?
Ю ли я? 🤔
вот да. оттуда я вынес представление о хаскеле как о языке для академических ученых. потому как с прикладной областью не сложилось
При том что "ни на чем другом это, конечно, вообще не вышло бы написать", а не сложилось именно у хаскеля?
Daniel
коллеги, вам обязательно надо со мной спорить
Daniel
?
Daniel
я же предельно ясно выражаюсь
Daniel
это в какие годы было-то?
середина нулевых
A64m
ну, не думаю, что много найдется хаскелистов, которые скажут, что хаскель годился для чего-то практического года до 2010
Daniel
а что изменилось?
Daniel
раз уж я к вам забрел - повышу уровень эрудиции :)
A64m
более-менее нормальный рантайм, библиотеки какие-то появились
Cheese
не тормозит на ровном месте?
A64m
ну и общая недоделанность как-то сгладилась
A64m
что значит "нормальный"?
с SMP, асинхронным и.о, параллельным сборщиком
Leonid 🦇
Хаскель в проде, зато на свободе
Artem
Параллельный сборщик, мне казалось, всё ещё недоделанный: на большом количестве процессоров (48 и выше), всё начинает сильно тормозить
Leonid 🦇
Запускай два процесса по 24 ядра
Денис
Ошибка какая-то странная не могу разобраться плиз хелп https://pastebin.com/mN5s4iwX
Зигохистоморфный
просто добавь AllowAmbiguousTypes в прагмы
Денис
А почему они Ambiguous?
Денис
Понял
Cheese
просто добавь AllowAmbiguousTypes в прагмы
классический способ — передать Proxy
Денис
Это из-за хиндли-милнера и возможной неинъективности Context?
Денис
Если добавить AllowAmbigousTypes, то оно иногда будет при выведении типов фейлиться?
Cheese
их, родимых
Cheese
Денис
Про Proxy не понял
Cheese
Если добавить AllowAmbigousTypes, то оно иногда будет при выведении типов фейлиться?
будет всегда фэйлиться, но позже, так что будет возможность указать тип вручную
Cheese
Про Proxy не понял
Proxy инъективен
Денис
http://hackage.haskell.org/package/base-4.11.1.0/docs/Data-Proxy.html?
Cheese
добавление в функцию фиктивного параметра Proxy m позволит вычислить m
Денис
понял
Денис
костыль какой-то
Cheese
хотя она сама что-то вроде костыля в системе типов
Денис
эх
A64m
эх
можно не прокси, а TypeApplications использовать, там просто типы указываются, параметры в функции добавлять не надо
Денис
Ну то есть тоже явно тип прописывать нужно, но не через ::, а через @?
A64m
ну да, часть типа
A64m
ну AllowAmbiguousTypes отключают проверку, которая запрещает писать код, который без TypeApplications использовать не получится
Денис
Вообще может этого можно как-то избежать? К примеру вооще type families не использовать. Я хотел абстрагировать доступ к базе данных, что б в будущем можно было бд заменить на rest api. Нашёл статейку: http://www.parsonsmatt.org/2018/03/22/three_layer_haskell_cake.html. Там на втором уровне AcquireUser вроде то, что мне нужно. Но я не нашёл хорошего способа добавить туда инициализацию модели и извлечение значения из монады. Можно, конечно, использовать конкретные функции, но это будет нарушением абстракции, просто поменять реализацию не получится.
A64m
а data families использовать можно?
Денис
Ещё был вариант написать код использующий определённый набор функций, которые делают запросы к бд, а позже заменить этот модуль на тот, который использует rest api и реализует функции с такими же названиями
Денис
Да всё можно, лишь бы работало
Денис
Попробую
Денис
data не хотел, потому что сначала в конструктор обернуть надо, потом разворачивать...
Денис
а data families использовать можно?
C data работает, большое спасибо
Ilya
хах, я недавно пробовал похожую задачу решить, только ещё похардовее
Ilya
но в итоге понял что оно не выразимо в текущей системе типов хаскеля
Daniel
и что делает хаскелист, встретив такое?
Ilya
смиряется
Daniel
а задачу куда?
Ilya
но вообще в планах немного переписать API surface
Ilya
что бы на GADT легло
Ilya
угу, там тоже была проблема с тем, что хотелось в произвольной монаде использовать типы данных и без явного указания манадки через TypeApplication или без оборачивания в newtype не выходило
A64m
быть хаскелистом: 1) изобретаешь ньютайпы как стредство деланья в хаскеле чуть менее чем всего 2) избегаешь их
Ilya
я не настоящий сварщик
Ilya
у меня даже PhD нет
Kirill
а каску где нашёл?
Aliester
apt install cask
A64m
да желание их избегать - это нормально
A64m
и понятно
Ю ли я? 🤔
apt install cask
cabal install cask
Алексей ayaye :)
да желание их избегать - это нормально
почему? во времена С мне очень не хватало таких typedef, которые компилятор считает другим типом
Ilya
на стеке вопрос забавный, каков приоритет оператора (::)? Он меньше, чем у ($), -1 что ли тогда
Aleksei (astynax)
Это не оператор
Aleksei (astynax)
Это синтаксис
Алексей ayaye :)
Struct с одним полем, you are welcome
это понятно, в сложных случаях так и делал. но это лишь подтверждает актуальность newtype