@haskellru

Страница 1238 из 1551
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
Просто иногда хочется написать что-то вроде Foo <=> Bar и реализовав один класс, получать инстанс второго
как в deriving via чтоли? для такого есть ТХ костыль который работает с 8.2 вроде

Антон
01.06.2018
21:54:51
data X = A | B
Блин, не делай так

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

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

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

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

т.е. нормального точного чека нету, потому что он замедлял бы компиляцию, и считается, что проблемы которые он исключил бы полностью встречаются редко

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
если честно, то я пошутил

Страница 1238 из 1551