Size: a a a

Compiler Development

2020 January 28

AT

Alexander Tchitchigin in Compiler Development
Но когерентность гарантирована не будет, это да.
источник

K

Kir in Compiler Development
Михаил Бахтерев
interface Monoid<A> { public A mempty(); ... } ?
Нет, придётся отдельныи пареметом передавать vtable
источник

МБ

Михаил Бахтерев in Compiler Development
Kir
Нет, придётся отдельныи пареметом передавать vtable
Зачем?
источник

K

Kir in Compiler Development
Потому что тайпкласс - это набор статических свойств типа. Он привязан не к объекту типа, а к самому (самим!) типам, реализующим этот тайпкласс. По сути - класс типов это пачка перегруженных функций.
источник

K

Kir in Compiler Development
В случае с вашим Monoid<A> на жаве, для того чтобы воспользоваться мктодом mempty, вам нужен объект типа A, для его вызова. А в хаскелле это просто mempty без аргументов - компилятор выведет.

Реализовано это как (на уровне Haskell Core) передача доп. параметров.
источник

МБ

Михаил Бахтерев in Compiler Development
Kir
Потому что тайпкласс - это набор статических свойств типа. Он привязан не к объекту типа, а к самому (самим!) типам, реализующим этот тайпкласс. По сути - класс типов это пачка перегруженных функций.
Нет. Вы кода пишете в сигнатуре функции Class a => ... это рассахаривается в ClassDictionary a -> ... связывание динамическое
источник

YS

Yuriy Syrovetskiy in Compiler Development
Михаил Бахтерев
interface Monoid<A> { public A mempty(); ... } ?
да, только classmethod забыли
источник

K

Kir in Compiler Development
Михаил Бахтерев
Нет. Вы кода пишете в сигнатуре функции Class a => ... это рассахаривается в ClassDictionary a -> ... связывание динамическое
Я что-то против сказал? Под статическим я имел ввиду модификатор static из жавы, который не может появляться в интерфейсе.
источник

А

Алексей in Compiler Development
да вроде может же
источник

А

Алексей in Compiler Development
только он будет собственно static
источник

K

Kir in Compiler Development
interface Monoid<A> { public static A mempty(); ... }?
источник

А

Алексей in Compiler Development
и ничем не поможет
источник

МБ

Михаил Бахтерев in Compiler Development
Kir
Я что-то против сказал? Под статическим я имел ввиду модификатор static из жавы, который не может появляться в интерфейсе.
Чё-то я потерял нить рассуждений. В Haskell тоже не будет никакого static.
источник

AV

Alexander Vershilov in Compiler Development
Это не совсем верно, оно всё статически резолвится, и во многих случаях словари инлайнятся. Единственная причина почему оно передаётся динамически, чтобы не раздувать бесконечно код
источник

МБ

Михаил Бахтерев in Compiler Development
Alexander Vershilov
Это не совсем верно, оно всё статически резолвится, и во многих случаях словари инлайнятся. Единственная причина почему оно передаётся динамически, чтобы не раздувать бесконечно код
И что? В Java тоже многое резолвится статически при компиляции
источник

AV

Alexander Vershilov in Compiler Development
Ну и бывают сложные случаи с вложенными типами, которые не известны на этапе компиляции, там то да точно динамическое
источник

K

Kir in Compiler Development
В жаве элеметами интерфейса являются методы (не-статические), в тайпклассе - это аналоги public static ..., с перегрузкой.
источник

МБ

Михаил Бахтерев in Compiler Development
Kir
В жаве элеметами интерфейса являются методы (не-статические), в тайпклассе - это аналоги public static ..., с перегрузкой.
Кто Вам сказал? Haskell не мономорфный
источник

МБ

Михаил Бахтерев in Compiler Development
Kir
В жаве элеметами интерфейса являются методы (не-статические), в тайпклассе - это аналоги public static ..., с перегрузкой.
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/11/levity-pldi17.pdf - о том, как именно обстоят дела в Haskell с полиморфизмом.
источник

YS

Yuriy Syrovetskiy in Compiler Development
Kir
interface Monoid<A> { public static A mempty(); ... }?
да, всё правильно. теперь переведите на свой язык instance Functor (Either a)
источник