Size: a a a

2020 July 29

ЕО

Евгений Омельченко... in Go-go!
Daniel Podolsky
я читнул в том коде, который protobuf генерит 🙂
Мне кажется ты путаешь прямую сумму и объединение
источник

DP

Daniel Podolsky in Go-go!
Евгений Омельченко
Мне кажется ты путаешь прямую сумму и объединение
возможно
источник

МП

Мимо Проходящий... in Go-go!
Евгений Омельченко
Ну это неправда. В расте enum это типичные типы суммы, а вот алгебраических типов там нет
Тип-сумма из типов-произведений. Это то определение, которым я пользуюсь. Кортежи есть, неизменяемые объекты есть, что ещё надо?
источник

с

сонная википедия... in Go-go!
Евгений Омельченко
Тут набег растофилов опять?
Да.
источник

ЕО

Евгений Омельченко... in Go-go!
Типы-суммы это тегированные объединения. Если у тебя есть TypeSum = IntConst int | StringConst string, то создаётся тип с двумя конструкторами и одним деструктором:

IntConst :: int -> TypeSum
StringConst :: int -> TypeSum

Деструктор через switch можно сделать:

switch (t) {
case IntConst x:
  здесь x
case StringConst s:
  здесь используем s
}

А объединения это как в тайпскрипте type TypeUnion = string | int. Такое можно бы сделать на гошных интерфейсах, если бы можно было методы определить для инта и стринга
источник

ЕО

Евгений Омельченко... in Go-go!
Хотя пока я писал, понял, что можно тегированные объединения через new type в го сделать
источник

с

сонная википедия... in Go-go!
это как же?
источник

с

сонная википедия... in Go-go!
Евгений Омельченко
Типы-суммы это тегированные объединения. Если у тебя есть TypeSum = IntConst int | StringConst string, то создаётся тип с двумя конструкторами и одним деструктором:

IntConst :: int -> TypeSum
StringConst :: int -> TypeSum

Деструктор через switch можно сделать:

switch (t) {
case IntConst x:
  здесь x
case StringConst s:
  здесь используем s
}

А объединения это как в тайпскрипте type TypeUnion = string | int. Такое можно бы сделать на гошных интерфейсах, если бы можно было методы определить для инта и стринга
какое жуткое сочетание C-like и Haskell-like определений
источник

ЕО

Евгений Омельченко... in Go-go!
Типы на хаскеле проще описывать, а код писать проще на си
источник

ЕО

Евгений Омельченко... in Go-go!
Ща
источник

МП

Мимо Проходящий... in Go-go!
Daniel Podolsky
я знаю один довольно большой проект на хаскеле. он уже мертв, к сожалению, но был интересный.

это была глобальная модель экономики.

расчет был на ленивые вычисления и автоматическое распараллеливание.

ленивые вычисления ок, а распараллеливание не заработало, и на этом все закончилось - автор экономист, а не программер, и заниматься хотел не программированием, а моделью
Может уже починили? Сергей Зефиров на конфе рассказывал, что он во всю юзает грин потоки на хаскеле для Алисы. Это был оффтопик)
источник

ЕО

Евгений Омельченко... in Go-go!
источник

с

сонная википедия... in Go-go!
а
источник

с

сонная википедия... in Go-go!
ну так еще можно метод приватный добавить
источник

с

сонная википедия... in Go-go!
и тогда никто не сможет реализовать интерфейс
источник

с

сонная википедия... in Go-go!
кроме вас
источник

МП

Мимо Проходящий... in Go-go!
Евгений Омельченко
Типы-суммы это тегированные объединения. Если у тебя есть TypeSum = IntConst int | StringConst string, то создаётся тип с двумя конструкторами и одним деструктором:

IntConst :: int -> TypeSum
StringConst :: int -> TypeSum

Деструктор через switch можно сделать:

switch (t) {
case IntConst x:
  здесь x
case StringConst s:
  здесь используем s
}

А объединения это как в тайпскрипте type TypeUnion = string | int. Такое можно бы сделать на гошных интерфейсах, если бы можно было методы определить для инта и стринга
А как это повлияет на скорость конпилции простите?
источник

с

сонная википедия... in Go-go!
Мимо Проходящий
А как это повлияет на скорость конпилции простите?
никак
источник

с

сонная википедия... in Go-go!
а вот держаться все будет в куче
источник

с

сонная википедия... in Go-go!
потому как неизвестен тип на этапе компиляции, а следовательно и его размер
источник