Evgeny
Нурлан
Я так понял @int_index говорил о типе, а сигнатуру функции я и в терминале могу посмотреть.
Нурлан
Evgeny
"MyType a" ?
Нурлан
"MyType a" ?
я хочу Stream a = a :& Stream a, но компилятор (7.10.3) говорит, что :& неразрешен в этой конутрукции
Нурлан
Evgeny
Нужно понимать, что тогда словарик будет с каждым значением отдельно таскаться.
Возвращаясь к этому. Не совсем ясно, почему мы будем таскать за собой vtable.
Допустим, есть наш любимый тип:
data MyType a where
MyType :: Num a => a -> MyType a
Ведь, когда мы создаем значение, то конкретный тип известен compile-time:
> let a = MyType (123::Int)
> :t a
=> a :: MyType Int
И чтобы его использовать нам вроде не нужен никакой vtable, т.к. все известно статически.
И, если это не так, то как оно происходит на самом деле? : )
Vladislav
Ты когда значение это создал, то vtable положилось в него. Сейчас статически тип известен, а через 2 строки ты в forall его обернешь и хрен там.
Evgeny
А в чем тогда отличие от не GADT?
Vladislav
Без GADT словарик в каждую функцию передается, но если тип статически известен, то срабатывает инлайнинг обычный
Evgeny
А если я ничего в forall не заворачиваю?
Vladislav
То кто-нибудь другой завернуть может. Но если это значение из функции не возвращается, то хз что там оптимизатор намутит, смотреть генерируемый Core надо.
Vladislav
Но подозреваю, что GHC в этом случае оптимизаций не выполняет, т.к. такое на практике едва ли вылезет когда-либо
Нурлан
о каком словарике вы говорите?
Vladislav
Словарь методов
Vladislav
vtable
Vladislav
Структура, в которой хранятся методы класса для конкретного типа
Vladislav
Напр., для Eq можно рассмотреть
data EqDict a = EqDict { (==) :: a -> a -> Bool; (/=) :: a -> a -> Bool }
Нурлан
Я так полагаю, что словарь методов должен создаваться при создании классов в обязательном порядке, в виде сигнатур функций. Когда же я закрепляю новый тип за определенным классом, разве я не должен определить как на новом типе действуют функции класса. Я все к тому, что эти определения должны быть где-то записаны. Разве это не в этот словарь идёт?
Нурлан
Или я не догнал что за словарь такой. Извиняйте за глупые вопросы. Буду курить GADT😀
Vladislav
Ну правильно
Vladislav
Реализация Eq для Integer например хранится в словарике EqDict Integer (если следовать примеру выше)
Vladislav
Когда ты пишешь f :: Eq a => ..., то в функцию f добавляется неявный аргумент -- словарик EqDict
Нурлан
Vladislav
Что?
Нурлан
А что происходит когда объявляется `inctance (Num a) => ....` ?
Нурлан
Что?
Словарь копируется в функцию
Vladislav
Ну он передается в нее при вызове, как любой другой аргумент.
Vladislav
А когда ты пишешь instance (Num a) => ..., то вместо словарика создается функция, генерирующая словарик на основе другого
Vladislav
По факту, тайпклассы - это словари + неявность + глобальность
Vladislav
Можно их вручную реализовать, просто кода придется побольше писать: http://www.haskellforall.com/2012/05/scrap-your-type-classes.html
Vladislav
Ну и GHC хорошо оптимизирует такой код, так что если инстанс известен во время компиляции, то скорее всего он будет заинлайнен и передаваться никуда не будет.
Нурлан
Я математик, не программист, поэтому моя мала мала тупить. Что значит заинлайнен?
Флибыч
Нурлан
😳 в чем тогда отличие внутренней функции от записи словаря?
Нурлан
Аргх, ладно надо читать документацию. Спасибо :)
Флибыч
Ну он же там написал, что передаваться никуда не будет.
А вообще, я дно, не слушай меня. :D
Нурлан
Ммм, кажется догнал
Нурлан
!!!
Alexander
Alexander
vtable наверное все же говорить не совсем корректно, просто словарь же?
Alexander
@int_index кстати, если у тебя GADT вида :: SomeConstraint a=> ... -> Foo a, то вроде все шансы, что заинлайнится есть, это все же не чистый existential где в lhs нету информации о типе
Vladislav
В чем принципиальная разница?
Vladislav
vtable наверное все же говорить не совсем корректно, просто словарь же?
Vladislav
Словарь/vtable
Vladislav
По крайней мере для C++ программистов должно необходимую ассоциацию в голове вызвать.
Vladislav
А касательно того, что в случае выше есть инфа о типе, то вероятность инлайна я и не отрицаю, только вот внутри значения тоже будет vtable, т.к. добавление констрейнта на конструктор влияет на то, как GHC будет представлять этот конструктор в памяти
Vladislav
s/vtable/словарь/g, запутался уже.
Vladislav
Я так понимаю GHC когда решает, какой будет memory layout у типа, решает это один раз и навсегда. А никто не мешает потом обернуть этот GADT в что-то типа:
data Some f where
  Some :: f a -> Some f
Vladislav
Поэтому словарь всегда будет внутри, для такого вот случая
Alexander
В общем я под vtable обычно понимал более сложную структуру данных
Alexander
Если в existential тип завернуть то да, ссылка на словарь будет лежать рядом со структурой
Alexander
Ну или если он уже в gadt
Alexander
@int_index да ссылка на словарь будет точно даже если инлацнится, но тебе чего лишнего принтера жалко :)
Alexander
Поинтера
Evgeny
как они это делают? выходят отсюда дважды
Alexander
Они настолько ненавидят haskell
Pavel 🕷
Это же хаскель
Mansur
Ну, зайдут ещё раз и никого не станет
Anonymous
http://book.realworldhaskell.org/
Anonymous
и http://learnyouahaskell.com/, но первая лучше
Yuri
А вот этого http://haskellbook.com/ ни у кого нет?
Anonymous
выглядит ненужно
Vladislav
RWH рассматривает кучу библиотек, каждая из которых уже много раз успела обновиться и поменяться.
Vladislav
Никому не порекомендую RWH в 2016
Vladislav
LYAH хорош, но там только основы. Но этих основ должно хватит, чтобы сдвинуться с мертвой точки. Особенно хорошо подойдет, если есть предыдущий опыт императивного программирования
Vladislav
Haskell Book лучшая опция, но все-таки $60 изниоткуда не появятся.
ㅤ
Vladislav
Ну вообще как бы неустанно пишут и пишут. Наверное в течение нескольких месяцев уже допишут, там последние главы остались
Denis
http://haskellbook.com/ - пожалуй, лучшая на сегодняшний день на английском.
Denis
но стоит $59..
Evgeny
предложить скинуться, наверное, было бы не этично ^^
Anonymous
а стоит ли эта книга своих 60 долларов?
Vladislav
Кто купил -- говорят, что стоит
Anonymous
но она для совсем новичков?
Vladislav
Да
Vladislav
Там начиная с лямбда-исчисления
Vladislav
Вот введение, 2 и 3 главы: http://haskellbook.com/images/sample.pdf