@haskellru

Страница 7 из 1551
Index
18.03.2016
07:48:20
data Num a => My a = My a deriving (Show)
Так делать вообще не нужно, никогда

Это никакого профита не дает.

С 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 посмотреть?

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

https://www.haskell.org/hoogle/
Правда в этой функции в hoogle какая-то странная сигнатура.

data MyType a where MyType :: Num a => a -> MyType a
а где объявление конструктора типа?

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

Index
18.03.2016
12:21:04
а как объявление конструктор типа Map посмотреть?
https://hackage.haskell.org/package/containers-0.5.7.1/docs/src/Data.Map.Base.html#Map

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
data Num a => My a = My a deriving (Show)
Не надо так советовать ..

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 рассматривает кучу библиотек, каждая из которых уже много раз успела обновиться и поменяться.

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