Cheese
@c, чтобы применить
Anonymous
@aadudyrev будет жить. Поприветствуем!
Cheese
func :: c -> IO ()
func (cVal :: c) = do
someFunc @c
вот так можно без квантора, кажется
Cheese
проверь
Alexander
Проверю
Alexander
Не похоже, что такое будет работать. Не может задедьюсить c, если оно не используется, даже если его передали откуда-то из другого места в функцию func
Cheese
Cheese
Alexander
Да, он предлагает отключить проверку. AllowAmbiguiousTypes
Cheese
Alexander
Ну, да, с этим расширением все компилится. На SO говорят, что оно в целом безопасное и редко кода его можно избежать
Dmitry
Редкий код долетит до середины компиляции...
Cheese
Cheese
только код не такой красивый будет
Alexander
или используя forall и ScopedTypeVariables
Alexander
прокси нужно если иначе в сигнатуре тип не присутствует
Alexander
а у нас есть какой-то колбек чтобы сообщить что GC произошло, чтобы статистику собрать?
Alexander
а то если делать с таймером, то часть пропустится
Alexander
gcDoneHook
Alexander
интересно а без собственного main можно её запилить?
Artem
Объясните новичку. пожалуйста.
Зачем нужен forall?
Разве без него функция не остается полиморфной?
Alexander
явно написанный forall (как выше) нужен чтобы включить режим в ScopeTypeVariables когда указание полиморфной переменной типа соотносится с тем что в сигнатуре
Alexander
а вообще неявный форол есть во всех полиморфных функциях
Alexander
ещё возможно разговор про полиморфизм высших рангов, но наверное нет?
Alexander
когда пишешь T (forall a . ...)
Cheese
да, для обычных полиморфных функций forall подразумевается, если его написать, ничего не изменится. разница есть для необычных — тех, что @qnikst выше упомянул
Alexander
я кстати правильно понял что ekg собирает статистику RTS только если его пнуть?
Alexander
судя по коду
Cheese
вопрос задавал @js_monk и про функции, а не списки
Cheese
«разнородный»
Cheese
кана
ну разве что когда нет переменных же
кана
с типо-переменными без forall их тупо никак в скоуп не добавить, кроме разве что кейсов, когда они уже в скоупе в объекте, классе
Anonymous
пример с forall:
https://en.m.wikibooks.org/wiki/Haskell/Existentially_quantified_types#The_forall_keyword
Cheese
A64m
не надо переставать. если в произведениях, которые вы вместо "рекордов" будуте с суммами использовать, будет много всего, то вы с ПМ намучаетесь, а для рекордов всякие вайлдкарды есть
A64m
после того, как дупликейт рекорд филдс появились вообще не вижу смысла не использовать рекорды всегда, как голые произведения их всегда можно будет конструировать и матчить - а наоборот - нет
A64m
(использовать геттеры для этих рекордов зато как раз не нужно, только сахар для пм)
Cheese
A64m
все что я написал - про один тип с суммой.
A64m
матчи вроде такого Foo a s d f g h j k l - серьезная проблема, как по опасности ошибку сделать, так и по проблемам с расширяемостью произведения
A64m
проблема у вас была сначала от того, что вы использовали старый рекордовый сахар вроде r{ x = x + 1}
надо по возможность использовать леннартовский сахар, а не марковский
Cheese
Cheese
A64m
puns/wildcards
A64m
AFoo Foo | ABar Bar
похоже на два двойных чиха
Anonymous
@vveysner будет жить. Поприветствуем!
Alexander
Вопрос на засыпку.
Возможно ли в Haskell сделать так, чтобы при каждом вызове некоей полиморфной функции программист обязан был передавать всегда новый тип, иначе - ошибка компиляции? Интерес академический.
Aliester
newtype в смысле?
Alexander
Хоть newtype, хоть базовый тип, хоть Succ (Succ Zero). Сами типы можешь выбрать какие хочешь, лишь бы механизм продемонстрировать
Alexander
Это вообще, видимо, сводится к хотелке невозможности вызвать одну и ту же функцию два раза с одним и тем же аргументом, что, скорее всего, противоречит самой сути языка. Но я таки не уверен
Алексей ayaye :)
Alexander
Ага
Алексей ayaye :)
Ага
только если значения других параметров будут отличаться. иначе функция не чистая
Alexander
Ну, ты, кажется, про рантайм уже говоришь. А я про компайлтайм
Alexander
В рантайме такой механизм придумать легче легкого с запоминанием глобального состояния.
Зигохистоморфный
тебе надо хранить где-то информацию о типах и проверять не попали ли они в той позиции и в том порядке
Alexander
Зигохистоморфный
можешь не проверять, написать на тайплевеле чекер какой-то
Dmitry
Можно свести этот вопрос к зацикливаеию. Если один раз появилось - компилируется, если два и больше - зацикливание ?
Alexander
Да, так можно условие поставить
Dmitry
Или так: нужно сделать так, чтобы функция f =...g...g... не компилировалась
Alexander
Да :)
Dmitry
Думаю, это как-то через типы, чтобы они не композились
Alexander
Может, что-нибудь из TH и квазиквот поможет?
Dmitry
Думаю, если бы bottom убрать, то можно было бы такое провернуть...
Alexander
Гммм, а линейные типы это не позволили бы?
Dmitry
Задачка интересная :)
Dmitry
g :: UnComposable, и поверх операции для композиции с любым остальным. Но тогда const g g прокатывает.
Dmitry
Надо думать
Ilya
Dmitry
Наверное, надо доказать (от противного), что такая конструкция не возможна
Alexander
Кстати, такой вариант, судя по всему, тоже должен ломаться: (g x, g x) (просто пара значений этой особенной функции)
Dmitry
Кто уже прочёл TAPL и сможет?
Dmitry
Ну вот как-то так: пусть такая конструкция возможна и f=...g...g... не компилируется. Тогда рассмотрим const id f, в ней второй аргумент не используется, вроде, должен отбрасываться. То есть, скомпилируется. Примерно так...