
Index
18.03.2016
07:48:20
Это никакого профита не дает.
С GADT-ами решение нормальное, но нишевое.
Нужно понимать, что тогда словарик будет с каждым значением отдельно таскаться.

Google

Index
18.03.2016
07:50:14
Получается ООП-но и часто некомпозабельно.

Kit
18.03.2016
07:51:33
в смысле для каждого типа из класса?

Index
18.03.2016
07:52:03
Нет
Для того типа, которому принадлежит значение.
Ну т.е. если в терминах C++ говорить, то vtable прямо в значение встраивается.

Kit
18.03.2016
07:53:08
прошу прощения, я с ООП ни разу и чем не пересекался
мне нравится haskell за то что в нем все абстрактно и практично и нету этого "кошка может мяу"

Index
18.03.2016
07:56:01
Ну такое решение тут как раз приводит к "кошка может мяу"
Вместо этого лучше все констрейнты накладывать там, где значение уже используется.
А при определении типов данных не предписывать, может оно мяу или нет
Посмотри например на стандартный тип Map k a
Чтобы там все работало, ключи должны быть инстансами Ord k
Но при объявлении типа это не упоминается.

Google

Index
18.03.2016
07:58:34
Констрейнт добавлен только к функциям работы с Map, которые полагаются на наличие этого порядка.

Kit
18.03.2016
07:59:39
а как объявление конструктор типа Map посмотреть?

Evgeny
18.03.2016
11:13:16

Kit
18.03.2016
11:19:41
Я так понял @int_index говорил о типе, а сигнатуру функции я и в терминале могу посмотреть.

Evgeny
18.03.2016
12:05:28
"MyType a" ?

Index
18.03.2016
12:21:04

Kit
18.03.2016
12:22:42
"MyType a" ?
я хочу Stream a = a :& Stream a, но компилятор (7.10.3) говорит, что :& неразрешен в этой конутрукции

Evgeny
18.03.2016
17:33:54
Нужно понимать, что тогда словарик будет с каждым значением отдельно таскаться.
Возвращаясь к этому. Не совсем ясно, почему мы будем таскать за собой vtable.
Допустим, есть наш любимый тип:
data MyType a where
MyType :: Num a => a -> MyType a
Ведь, когда мы создаем значение, то конкретный тип известен compile-time:
> let a = MyType (123::Int)
> :t a
=> a :: MyType Int
И чтобы его использовать нам вроде не нужен никакой vtable, т.к. все известно статически.
И, если это не так, то как оно происходит на самом деле? : )

Index
18.03.2016
17:36:28
Ты когда значение это создал, то vtable положилось в него. Сейчас статически тип известен, а через 2 строки ты в forall его обернешь и хрен там.

Evgeny
18.03.2016
17:38:48
А в чем тогда отличие от не GADT?

Index
18.03.2016
17:39:48
Без GADT словарик в каждую функцию передается, но если тип статически известен, то срабатывает инлайнинг обычный

Evgeny
18.03.2016
17:48:28
А если я ничего в forall не заворачиваю?

Index
18.03.2016
17:49:55
То кто-нибудь другой завернуть может. Но если это значение из функции не возвращается, то хз что там оптимизатор намутит, смотреть генерируемый Core надо.
Но подозреваю, что GHC в этом случае оптимизаций не выполняет, т.к. такое на практике едва ли вылезет когда-либо

Kit
18.03.2016
19:43:55
о каком словарике вы говорите?

Index
18.03.2016
20:09:47
Словарь методов
vtable

Google

Index
18.03.2016
20:10:01
Структура, в которой хранятся методы класса для конкретного типа
Напр., для Eq можно рассмотреть
data EqDict a = EqDict { (==) :: a -> a -> Bool; (/=) :: a -> a -> Bool }

Kit
18.03.2016
20:25:11
Я так полагаю, что словарь методов должен создаваться при создании классов в обязательном порядке, в виде сигнатур функций. Когда же я закрепляю новый тип за определенным классом, разве я не должен определить как на новом типе действуют функции класса. Я все к тому, что эти определения должны быть где-то записаны. Разве это не в этот словарь идёт?
Или я не догнал что за словарь такой. Извиняйте за глупые вопросы. Буду курить GADT?

Index
19.03.2016
06:51:22
Ну правильно
Реализация Eq для Integer например хранится в словарике EqDict Integer (если следовать примеру выше)
Когда ты пишешь f :: Eq a => ..., то в функцию f добавляется неявный аргумент -- словарик EqDict

Kit
19.03.2016
11:31:11

Index
19.03.2016
11:31:36
Что?

Kit
19.03.2016
11:32:11
А что происходит когда объявляется `inctance (Num a) => ....` ?
Что?
Словарь копируется в функцию

Index
19.03.2016
11:33:06
Ну он передается в нее при вызове, как любой другой аргумент.
А когда ты пишешь instance (Num a) => ..., то вместо словарика создается функция, генерирующая словарик на основе другого
По факту, тайпклассы - это словари + неявность + глобальность
Можно их вручную реализовать, просто кода придется побольше писать: http://www.haskellforall.com/2012/05/scrap-your-type-classes.html
Ну и GHC хорошо оптимизирует такой код, так что если инстанс известен во время компиляции, то скорее всего он будет заинлайнен и передаваться никуда не будет.

Kit
19.03.2016
11:36:51
Я математик, не программист, поэтому моя мала мала тупить. Что значит заинлайнен?

Фԉùཎыч⚠️
19.03.2016
11:46:45

Kit
19.03.2016
11:47:53
? в чем тогда отличие внутренней функции от записи словаря?
Аргх, ладно надо читать документацию. Спасибо :)

Google

Фԉùཎыч⚠️
19.03.2016
11:48:51
Ну он же там написал, что передаваться никуда не будет.
А вообще, я дно, не слушай меня. :D

Kit
19.03.2016
11:49:19
Ммм, кажется догнал
!!!

Alexander
20.03.2016
10:32:10
vtable наверное все же говорить не совсем корректно, просто словарь же?
@int_index кстати, если у тебя GADT вида :: SomeConstraint a=> ... -> Foo a, то вроде все шансы, что заинлайнится есть, это все же не чистый existential где в lhs нету информации о типе


Index
20.03.2016
15:57:03
В чем принципиальная разница?
vtable наверное все же говорить не совсем корректно, просто словарь же?
Словарь/vtable
По крайней мере для C++ программистов должно необходимую ассоциацию в голове вызвать.
А касательно того, что в случае выше есть инфа о типе, то вероятность инлайна я и не отрицаю, только вот внутри значения тоже будет vtable, т.к. добавление констрейнта на конструктор влияет на то, как GHC будет представлять этот конструктор в памяти
s/vtable/словарь/g, запутался уже.
Я так понимаю GHC когда решает, какой будет memory layout у типа, решает это один раз и навсегда. А никто не мешает потом обернуть этот GADT в что-то типа:
data Some f where
Some :: f a -> Some f
Поэтому словарь всегда будет внутри, для такого вот случая


Alexander
20.03.2016
20:08:51
В общем я под vtable обычно понимал более сложную структуру данных
Если в existential тип завернуть то да, ссылка на словарь будет лежать рядом со структурой
Ну или если он уже в gadt
@int_index да ссылка на словарь будет точно даже если инлацнится, но тебе чего лишнего принтера жалко :)
Поинтера

Evgeny
21.03.2016
12:24:56
как они это делают? выходят отсюда дважды

Google

Alexander
21.03.2016
20:42:31
Они настолько ненавидят haskell

Pavel ?
21.03.2016
20:44:02
Это же хаскель

Mansur
21.03.2016
21:34:42
Ну, зайдут ещё раз и никого не станет

trump ? trump ? hillary
22.03.2016
18:46:24
http://book.realworldhaskell.org/
и http://learnyouahaskell.com/, но первая лучше

Yuri
22.03.2016
18:47:13
А вот этого http://haskellbook.com/ ни у кого нет?

trump ? trump ? hillary
22.03.2016
18:47:41
выглядит ненужно

Index
22.03.2016
19:32:54
RWH рассматривает кучу библиотек, каждая из которых уже много раз успела обновиться и поменяться.