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