
Imants
01.06.2018
17:15:50
Вот в C# и джаве хороший тон начать с интерфейсов и тестов, а потом переходить к имплементации.
Т.е., типы важны потребителям кода (напр., мученикам из поддержки). Даже если компилятор обойдётся.

A64m
01.06.2018
17:16:58
но аннотировать даже в хаскеле принято больше, чем только это
топлевельные определения, которые частью интерфейса не являются тоже аннотируются

Евгений
01.06.2018
18:02:45

Google

Yuriy
01.06.2018
18:09:50
если кому-то интересная моя борьба с красотой, 5 переменными и линзами, то я переписал State+Bookkeeper+OverloadedLabels на ST. получилось почти столь же компактно, да ещё и работать стало на порядок быстрее

A64m
01.06.2018
18:12:10
и хуже чем пять парамеров?

Yuriy
01.06.2018
18:21:56

A64m
01.06.2018
18:22:47
и хуже чем рекорд и леннартовский пм для него

Kirill
01.06.2018
18:24:51
а что такое "леннартовский пм"?

A64m
01.06.2018
18:25:51
RecordWildCards

Yuriy
01.06.2018
18:33:30

A64m
01.06.2018
18:33:57
не принципиально

Anatolii
01.06.2018
19:45:20
через genericToJSON все таки сделал нужный мне инстанс ToJSON
теперь захотел вынести код вотдельную функцию
f x = case genericToJSON defaultOptions x of
Object o -> o
_ -> error "toObject: value isn't an Object"
и хочу же написать сигнатуру чтобы компилятор не ругался
library/CompletionReport/Report.hs:61:1: warning: [-Wmissing-exported-signatures]
Top-level binding with no type signature:
f :: (aeson-1.2.4.0:Data.Aeson.Types.ToJSON.GToJSON
Value Zero (Rep a),
Generic a) =>
a -> Object

Google

Anatolii
01.06.2018
19:47:16
добавляю сигнатуру
f :: (GToJSON Value Zero (Rep a), Generic a) => a -> Object
и получаю
library/CompletionReport/Report.hs:61:7: error:
• Expecting one fewer arguments to ‘GToJSON Value Zero’
Expected kind ‘(* -> *) -> Constraint’,
but ‘GToJSON Value Zero’ has kind ‘Constraint’
• In the type signature:
f :: (GToJSON Value Zero (Rep a), Generic a) => a -> Object
|
61 | f :: (GToJSON Value Zero (Rep a), Generic a) => a -> Object
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
library/CompletionReport/Report.hs:61:21: error:
• Expected kind ‘* -> *’, but ‘Zero’ has kind ‘*’
• In the second argument of ‘GToJSON’, namely ‘Zero’
In the type signature:
f :: (GToJSON Value Zero (Rep a), Generic a) => a -> Object
|
61 | f :: (GToJSON Value Zero (Rep a), Generic a) => a -> Object
| ^^^^

Yuriy
01.06.2018
19:56:04
там разные GToJSON
есть GToJSON, а есть GToJSON
короче, убери Value
type GToJSON = ToJSON.GToJSON Value

Anatolii
01.06.2018
19:58:00
спасиб
я просто оч удивлялся что у genericToJSON такая же сигнатура:)

Pig
01.06.2018
20:30:37
Как называется ситуация, когда есть пачка тайпклассов и не совсем понятно как их комбить, typeclass hell?

Alexander
01.06.2018
20:31:14
не уверен что этой ситуации давали специальное имя

Pig
01.06.2018
20:32:41
Пусть будет без имени, есть какие-нибудь гайды как с этим бороться?

Alexander
01.06.2018
20:34:28
лучше вопрос задай, что не понятно
это как вопрос, есть библиотеки и непонятно как их композить
ну что на это ответить?

Pig
01.06.2018
20:39:41
Просто иногда хочется написать что-то вроде Foo <=> Bar и реализовав один класс, получать инстанс второго

Yuriy
01.06.2018
20:40:50
ты просто не должен этого хотеть. это не связано с комбинацией классов
если они друг из друга следуют, то это должен быть один класс

Pig
01.06.2018
20:50:27
Есть отдельные сво-ва типа рефлексивности\симметричности\тразитивности и не понятно как их комбить в разнообразные отношения
Equivalence это Reflexive+Symmetric+Transitive, но когда каждое сво-во в отдельном интерфейсе нельзя просто объявить какое-нибудь отношение эквивалентностью, сначала надо написать другие инстансы
А если сгруппировать все свойства в составные интерфейсы тоже будет плохо, они бывают нужны по одиночке

Google

Yuriy
01.06.2018
21:00:52
сделай 3 класса для R, S, T, и четвёртый, который от них зависит

A64m
01.06.2018
21:11:13

Антон
01.06.2018
21:54:51

Pig
01.06.2018
21:57:41

A64m
01.06.2018
21:58:20
в идрисе нет тайпклассов
проблема решена

Ilya
02.06.2018
01:54:27
всё-таки классы включают в себя тайпклассы как подмножество, так что есть

Евгений
02.06.2018
07:06:49

Yuriy
02.06.2018
07:10:56

Pig
02.06.2018
07:26:10
Да, я, конечно не самый умный человек.
Необходимо:
class (R, S, T) => E where
Достаточно:
instance (R, S, T) => E where
Вот и эквивалентность.

Tatiana
02.06.2018
07:44:16
В idris в одной из версий тайп классы заменили на интерфейсы. Вот так и пишут теперь interface Show a where

Yuriy
02.06.2018
07:48:44

Pig
02.06.2018
08:01:19
Вроде так же

A64m
02.06.2018
09:47:49
они же не когерентные, т.е. вообще не тайпклассы

Tatiana
02.06.2018
10:00:58
Честно говоря я не знаю , что значит когерентность в таком контексте. Но для меня выглядит так, что они просто вместо тайп классов ввели понятие interface . В доке они пишут we use interface which is similar to type classes in Haskell or traits in Rust.

Alexander
02.06.2018
10:14:25
когерентность = гарантия существование единствкнной реализации для выбранного типа
ключевое свойство классов типов

kana
02.06.2018
10:31:00
тайпклассы идриса не когерентны из-за именных инстансов что ли?

A64m
02.06.2018
10:40:36
да

kana
02.06.2018
11:05:22
Так именные инстансы никуда сами неявно не подставляются вроде, вызвать именной инстанс это как явно в ньютайп завернуть и развернуть
Но я не уверен конечно

Google

A64m
02.06.2018
11:08:36
по идее, это похоже на каст функции для которой уже инстансы выбраны к функции другого типа, но в хаскеле то в этом случае ролями можно защитить какой-нибудь Set от ломания

Oleg
02.06.2018
11:08:41
Мне кажется, они некогерентны не потому что они именные

A64m
02.06.2018
11:09:02
ну, там вроде есть и другие причины
но при наличии именных инстансов нету когерентности просто по определению.
насколько это проблемно с практической стороны - отдельный вопрос

Oleg
02.06.2018
11:09:57
А потому что хз как сделать неэкстенcиональное равенство с когерентностью

Pig
02.06.2018
11:18:57

A64m
02.06.2018
11:20:15
так какая разница, один инстанс на тип во всем мире, во всех пространствах имен
вообще этих самых простанств для инстансов уже достаточно для нарушения когерентности, например если можно не имортировать выборочно инстанс из модуля, как можно можно выбирать какие функции из модуля (не) импортировать

Pig
02.06.2018
11:36:39
Хмм, а в Хаскеле нельзя держать разные инстансы в разных модулях?

A64m
02.06.2018
11:39:57
можно, но это неправильная имплементация хаскеля ради того чтоб раздельную компиляцию иметь, т.е. это в большинстве опасных случаев обнаружится в месте применения, но можно и исхитриться и поломать код. т.е. это дырка в гхц и баг с соотв. тикетом. за это сироты и не любят, без них такой проблемы бы не было
т.е. когерентность в хаскеле можно нарушить при неправильном использовании сирот, оверлапящихся инстансов, ролей, ну понятно unsafeCoerce
кстати, может в 8.6 или 8.8 дженерики и библиотечные рекорды будут поменьше тормозить компиляцию (но это не точно)
https://phabricator.haskell.org/D4766

Anatolii
02.06.2018
11:52:28

A64m
02.06.2018
11:53:11
опять таки в большем числе случаев чем те, которые действительно опасны
т.е. нормального точного чека нету, потому что он замедлял бы компиляцию, и считается, что проблемы которые он исключил бы полностью встречаются редко

Pig
02.06.2018
11:56:01

A64m
02.06.2018
11:56:36
вне модуля в котором определен тип или класс

Index
02.06.2018
14:23:31
x =
'[ a
, a
, a
, a
]
Парсер всё стерпит

Google

Index
02.06.2018
14:24:10
Синтаксическая арт-инсталляция

Maxim
02.06.2018
14:24:44
JAPH!

Index
02.06.2018
14:25:36
x =
'[ a,
a,
a ]
^ а вообще я бы так форматировал
trailing commas > leading commas
А еще так можно скобки мысленно растянуть вертикально на весь столбец, то есть они как в мат. нотации всё подвыражение закрывают. Закрывающая скобка в начале строки это программистское извращение

Alexander
02.06.2018
14:31:17
я считаю, что строки должны рифмоваться
иначе быстро устаешь когда читаешь код
длина строк и количество гекзаметром

Index
02.06.2018
14:32:50
хз, я обычно устаю от смысла кода, а не переносов, обычно приходится четыре раза одну строку перечитывать, с такой плотностью инфы не до рифм
но может это я тормозной и у людей другой боттлнек восприятия

Alexander
02.06.2018
14:33:35
если честно, то я пошутил