Size: a a a

2020 May 26

AV

Alexander Vershilov in Haskell
A64m AL256m qn I0
Thomas Jaeger
А как пакет зовут?
источник

AA

A64m AL256m qn<co... in Haskell
Alexander Vershilov
А как пакет зовут?
пакета нет
источник

LO

Leonid 🦇 Onokhov in Haskell
Maxim Koltsov
кол стек!
Считай дикт
источник

AA

A64m AL256m qn<co... in Haskell
Oleg ℕizhnik
ну т.е. вот за всё время возникло две идеи, куда их применить, ни одна не будет реализована полноценно
поэтому и интересен анализ
это ж большая редкость когда человек и про скалу и про хаскель что-то знает
источник

Oℕ

Oleg ℕizhnik in Haskell
A64m AL256m qn I0
поэтому и интересен анализ
это ж большая редкость когда человек и про скалу и про хаскель что-то знает
согласен, из таких знаю только @kai_neko
источник

Oℕ

Oleg ℕizhnik in Haskell
A64m AL256m qn I0
поэтому и интересен анализ
это ж большая редкость когда человек и про скалу и про хаскель что-то знает
в смысле вы всерьёз мне предлагаете прямо здесь сравнить?
источник

AA

A64m AL256m qn<co... in Haskell
Oleg ℕizhnik
согласен, из таких знаю только @kai_neko
ну его не уговорить сравнить Ж(((
источник

AA

A64m AL256m qn<co... in Haskell
Oleg ℕizhnik
в смысле вы всерьёз мне предлагаете прямо здесь сравнить?
конечно!
источник

NI

Nick Ivanych in Haskell
Oleg ℕizhnik
в смысле вы всерьёз мне предлагаете прямо здесь сравнить?
Ты так говоришь, как будто в этом есть что-то плохое.
источник

λ

λоλторт in Haskell
Oleg ℕizhnik
в смысле вы всерьёз мне предлагаете прямо здесь сравнить?
в гисте, сюда ссылку
источник

Oℕ

Oleg ℕizhnik in Haskell
A64m AL256m qn I0
конечно!
Хаскельные имплиситы резолвятся по имени, скаловые резолвятся по типу.

Скаловые имплиситы родились примерно с той же целью, что хаскельные, но затем проделали большой путь по превращению в костыльные тайпклассы. Поэтому большая часть сравнения будет, скорее затрагивать их.

Т.е. для симуляции тайпкласса придумывается параметрический тип, применения которого служат затем заголовками инстансов.

Никаких ограничений на алиасы нет, чтобы поставить приоритет у скаловых инстансов никакого специального синтаксиса нет. Используются родные любому ооп-разработчику механизмы "подтипирования" и "наследования" - да, это два разных способа сделать один инстанс более приоритетным, чем другой, вступающие в конфликт.

Скаловые имплиситы будут резолвиться не только в непосредственном лексическом скоупе места вызова, компилятор дополнительно посмотрит в компаньонах всех упомянутых типов, опять же симулируя, поиск инстансов из модулей, в которых определён тайпкласс и сам тип.
Как и в хаскеле инстансы могут быть полиморфными и требовать других инстансов. Как и в хаскеле с достаточным набором расширений и в расте, на этом можно строить какие-то фриканутые исчисления.

Скаловые имплиситы очень существенно некогерентны, и участвуют в выводе типов. Т.е. скаловый компилятор может найти инстанс, заматчив его параметры с известными типами и получить оттуда часть неизвестных. Примерно, как если бы у вас были фундепы, которые работали во все стороны (непредсказуемо). Имплиситы могуть быть реализованы с помощью макросов. Мало того, эти макросы могут производить не только термы, но и типы. Например генерация Generic (примерный аналог того, что х-ле) сделан как такой макро-имплисит.

Предсказать ход вывода типов перемежающийся с такой деривацией очень сложно, это зависит от текущей реализации компилятора и меняется из версии в версию

Однако упоминали, что артефакты тех времён, когда имплиситы несли функцию просто неявных параметров во 2-й скале остались.
В частности, единственный способ принести сиротские инстансы, а они часто нужны - импортировать или примешать реальные имена в лексический скоуп, это значит, что любая переменная с тем же именем зашэдоуит ваш инстанс, и действительно, порядок импортов или наличие локально объявленных имён обычных переменных может помешать компилятору увидеть инстанс.
В третьей скале это пофиксили.

Однако имплиситы остаются просто значениями обычных типов, поэтому можно делать разные трюки.
Например для любителей тэглесс файнал можно положить инстанциированные инстансы прямо контекст ридер-манатки и дальше вывести что-то вроде
HasLens ctx (Foo f), MonadReader f ctx =>  Foo f
источник

AA

A64m AL256m qn<co... in Haskell
Oleg ℕizhnik
Хаскельные имплиситы резолвятся по имени, скаловые резолвятся по типу.

Скаловые имплиситы родились примерно с той же целью, что хаскельные, но затем проделали большой путь по превращению в костыльные тайпклассы. Поэтому большая часть сравнения будет, скорее затрагивать их.

Т.е. для симуляции тайпкласса придумывается параметрический тип, применения которого служат затем заголовками инстансов.

Никаких ограничений на алиасы нет, чтобы поставить приоритет у скаловых инстансов никакого специального синтаксиса нет. Используются родные любому ооп-разработчику механизмы "подтипирования" и "наследования" - да, это два разных способа сделать один инстанс более приоритетным, чем другой, вступающие в конфликт.

Скаловые имплиситы будут резолвиться не только в непосредственном лексическом скоупе места вызова, компилятор дополнительно посмотрит в компаньонах всех упомянутых типов, опять же симулируя, поиск инстансов из модулей, в которых определён тайпкласс и сам тип.
Как и в хаскеле инстансы могут быть полиморфными и требовать других инстансов. Как и в хаскеле с достаточным набором расширений и в расте, на этом можно строить какие-то фриканутые исчисления.

Скаловые имплиситы очень существенно некогерентны, и участвуют в выводе типов. Т.е. скаловый компилятор может найти инстанс, заматчив его параметры с известными типами и получить оттуда часть неизвестных. Примерно, как если бы у вас были фундепы, которые работали во все стороны (непредсказуемо). Имплиситы могуть быть реализованы с помощью макросов. Мало того, эти макросы могут производить не только термы, но и типы. Например генерация Generic (примерный аналог того, что х-ле) сделан как такой макро-имплисит.

Предсказать ход вывода типов перемежающийся с такой деривацией очень сложно, это зависит от текущей реализации компилятора и меняется из версии в версию

Однако упоминали, что артефакты тех времён, когда имплиситы несли функцию просто неявных параметров во 2-й скале остались.
В частности, единственный способ принести сиротские инстансы, а они часто нужны - импортировать или примешать реальные имена в лексический скоуп, это значит, что любая переменная с тем же именем зашэдоуит ваш инстанс, и действительно, порядок импортов или наличие локально объявленных имён обычных переменных может помешать компилятору увидеть инстанс.
В третьей скале это пофиксили.

Однако имплиситы остаются просто значениями обычных типов, поэтому можно делать разные трюки.
Например для любителей тэглесс файнал можно положить инстанциированные инстансы прямо контекст ридер-манатки и дальше вывести что-то вроде
HasLens ctx (Foo f), MonadReader f ctx =>  Foo f
спасибо, но вот сравнения имплицитов чет не очень много здесь
источник

Oℕ

Oleg ℕizhnik in Haskell
Ну основные именно с имплиситами хаскельными:
Резовятся по типу, а не по имени
Можно определять, глобальные автоподтягиваемые инстансы
Есть механизмы деривации, и они интерферируют с выводом типов.
источник

AA

A64m AL256m qn<co... in Haskell
Oleg ℕizhnik
Ну основные именно с имплиситами хаскельными:
Резовятся по типу, а не по имени
Можно определять, глобальные автоподтягиваемые инстансы
Есть механизмы деривации, и они интерферируют с выводом типов.
ну так хачкелеимплициты тоже можно "глобальные определять". синтаксиса для этого нету правда.
пишешь инстанс IP "foo" Bar и все
источник

AA

A64m AL256m qn<co... in Haskell
вообще мне страшно даже задумываться че там можно наколхозить что вне вот этих вот рельс для которых синтаксис сделан
источник

Oℕ

Oleg ℕizhnik in Haskell
ну да, я имел в виду, естественным спобом
Насколько я понимаю выражение через инстанс IP - это деталь реализации и не то, чтобы кто-то будет заботиться о совместимости, если решат что-то переделать
источник

AA

A64m AL256m qn<co... in Haskell
Oleg ℕizhnik
ну да, я имел в виду, естественным спобом
Насколько я понимаю выражение через инстанс IP - это деталь реализации и не то, чтобы кто-то будет заботиться о совместимости, если решат что-то переделать
никто не заботится не то что одеталях реализации хачкелеимплицитов а обо всем с ними связанным, там постоянно че-то меняют или урезают
посколько никто ими не пользуется, это проходит незамеченным
источник

AA

A64m AL256m qn<co... in Haskell
у них меняли синтаксис, выкидывали линейную разновидность, запретили "наследование" от них для классов, превратили в тайпкласс IP и т.д.
источник

AA

A64m AL256m qn<co... in Haskell
т.е. десятки лет бурлит такое вот ВООБЩЕ не иследованное адище, вернее постоянно рождаются и погибают новые адища
источник

PG

Pig Greenest in Haskell
Что подразумевается под хаскельными имплиситами? Инстансы или что-то ещё подвезли?
источник