Size: a a a

2020 June 11

DF

Dollar Føølish in rust_offtopic
Не вижу связи
источник

DF

Dollar Føølish in rust_offtopic
Как с++ связан с тем что все плохо ?
источник

УМ

Убийца Мамонтов... in rust_offtopic
Dollar Føølish
Как с++ связан с тем что все плохо ?
непосредственно
источник

DF

Dollar Føølish in rust_offtopic
Кек
источник

S

Soul in rust_offtopic
Dollar Føølish
Как с++ связан с тем что все плохо ?
Чтобы баги на винде фиксить, надо программиста на С++. А если этим заставить заниматься какого-нибудь сеньор UX господина с докторской степенью и знанием C#, то он будет делать это неохотно и тоскливо
источник

DF

Dollar Føølish in rust_offtopic
Винда на с написана большей частью
источник

DF

Dollar Føølish in rust_offtopic
Также на с++ и сишарп
источник

DF

Dollar Føølish in rust_offtopic
Штоб фиксить баги винды достаточно пригласить ребят из реакт ос кек
источник

T1

Tony 123 in rust_offtopic
Dollar Føølish
Не вижу связи
+++
источник

T1

Tony 123 in rust_offtopic
Soul
учитывая что вакансий просто программиста на просто С++ у них нет, понятно почему всё так плохо
Да не, херь
источник

AZ

Alex Zhukovsky in rust_offtopic
Ну, в TS принято, что если компаратор не находит различия в типах за фиксированное число шагов — он просто возвращает true.
источник

DF

Dollar Føølish in rust_offtopic
Ого
источник

DF

Dollar Føølish in rust_offtopic
Прям ии
источник

t

toriningen in rust_offtopic
Tony 123
все разное пояснение дают ту
Так. Есть у тебя императивная программа нормального человека:

declare function input(): int;
declare function print(value: ...): void;

function main(): void {
   a = input()
   b = input()
   с = a + b
   print(c)
   print("свинья^W монады охуенная тема")
}

main()
print("Ну вот и посчитали!")
источник

t

toriningen in rust_offtopic
Я реализации input() и print() не привожу, и так понятно, что это. Если записать ее в виде монады, то будет как-то так:

declare function inputM(): MyCoolMonad<int>;
declare function printM(value: ...): MyCoolMonad<Void>;

function main(): MyCoolMonad<Void> {
   return inputM().then((a: int): MyCoolMonad<Void> => {
       return inputM().then((b: int): MyCoolMonad<Void> => {
           return MyCoolMonad.value(a + b).then((c: int): MyCoolMonad<Void> => {
               return printM(c).then((_: Void): MyCoolMonad<Void> => {
                   return printM("свинья^W монады охуенная тема")
               })
           })
       })
   })
}

main().then((_: Void): MyCoolMonad<...> = {
   return printM("Ну вот и посчитали!")
})
источник

t

toriningen in rust_offtopic
Так, многословно немного вышло.

Давай уберем типы результата, потому что у нас же умный псевдоязык, сам сможет вывести. А еще, т.к. () => { return 42 } это то же самое, что и () => 42, избавимся от лишних return:

declare function inputM(): MyCoolMonad<int>;
declare function printM(value: ...): MyCoolMonad<Void>;

main = (_: Void) =>
   inputM().then((a: int) =>
       inputM().then((b: int) =>
           MyCoolMonad.value(a + b).then((c: int) =>
               printM(c).then((_: Void) =>
                   printM("свинья^W монады охуенная тема")

main().then((_: Void) =>
   printM("Ну вот и посчитали!")
источник

t

toriningen in rust_offtopic
Уже лучше, да? Почти императивная программа. Давай в столбик запишем:

declare function inputM(): MyCoolMonad<int>;
declare function printM(value: ...): MyCoolMonad<Void>;

main = (_: Void) =>
   inputM().then((a: int) =>
   inputM().then((b: int) =>
   MyCoolMonad.value(a + b).then((c: int) =>
   printM(c).then((_: Void) =>
   printM("свинья^W монады охуенная тема")

main().then((_: Void) =>
   printM("Ну вот и посчитали!")
источник

t

toriningen in rust_offtopic
Отлично! Возможно, ты спросишь "А откуда взялось это говно, именуемое Void?" Так вышло, что функции в монадах должны вернуть _хоть что-то_, потому что следующая функция в цепочке должна получить _хоть что-то_ в качестве аргумента, и когда нам возвращать по сути нечего, этим _хоть чем-то_ в данном случае выступает значение типа Void, который называют "юнит-типом", и который не содержит ничего. Его еще называют ().

Так как писать в столбик и ставить тупые стрелки это не ок, умные люди изобрели "do-нотацию". Это такая нотация, которая позволяет нашу абсолютно чистую функциональную ни разу не императивную программу написать вот так:

declare function inputM(): MyCoolMonad<int>;
declare function printM(value: ...): MyCoolMonad<Void>;

main = (_: Void) => do
   a <- inputM()
   b <- inputM()
   c <- a + b
   _ <- printM(c)
   _ <- printM("свинья^W монады охуенная тема")

do
   _ <- main()
   _ <- printM("Ну вот и посчитали!")
источник

t

toriningen in rust_offtopic
А так как нам, в принципе, плевать, что мы положили в _ (там все равно Void, в котором информации нет), то можно убрать:

declare function inputM(): MyCoolMonad<int>;
declare function printM(value: ...): MyCoolMonad<Void>;

main = (_: Void) => do
   a <- inputM()
   b <- inputM()
   c <- a + b
   printM(c)
   printM("свинья^W монады охуенная тема")

do
   main()
   printM("Ну вот и посчитали!")
источник

t

toriningen in rust_offtopic
Чудесно. Найдите 3 отличия от императивной программы, с которой мы начали. Поздравляю, остался последний штрих - переименовать MyCoolMonad в IO, потому что именно так эта монада называется.

Когда мы выполним эту программу, мы получим что-то такое:

> 10
> 20
30
свинья^W монады охуенная тема
Ну вот и посчитали!
источник