DF
Size: a a a
DF
DF
УМ
DF
S
DF
DF
DF
T1
T1
AZ
DF
DF
t
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
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
() => { 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
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
Void
?" Так вышло, что функции в монадах должны вернуть _хоть что-то_, потому что следующая функция в цепочке должна получить _хоть что-то_ в качестве аргумента, и когда нам возвращать по сути нечего, этим _хоть чем-то_ в данном случае выступает значение типа 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
_
(там все равно 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
MyCoolMonad
в IO
, потому что именно так эта монада называется.> 10
> 20
30
свинья^W монады охуенная тема
Ну вот и посчитали!