Сегодня на улице прекрасная погода. Хорошее настроение. Но, увы, нужно переписать на питоне один кусок кода с многострочной лямбдой. Встречается часто. Есть какой-нибудь способ? По силу такое творению Гвидо? :)
Вот, на хаскеле его шаблон выглядит таким образом, где (>>=) - это просто бинарный оператор:
f m1 m2 m3 =
m1 >>= \x1 ->
m2 >>= \x2 ->
m3 >>= \x3 ->
return (x1, x2, x3)
Если не пользоваться стандартными функциями, то тоже самое можно было бы написать по-другому:
f m1 m2 m3 = do
x1 <- m1
x2 <- m2
x3 <- m3
return (x1, x2, x3)
Почти то же самое на лиспе (CL) записывается легко, где with-puper - особо определяемый макрос с макролетами let! и unit:
(defun f (m1 m2 m3)
(with-puper
(let! ((x1 m1)
(x2 m2)
(x3 m3))
(unit (list x1 x2 x3)))))
На F# тоже очень просто:
let f m1 m2 m3 = puper {
let! x1 = m1
let! x2 = m2
let! x3 = m3
return (x1, x2, x3)
}
По сути это синтаксический сахар вокруг следующего кода, где опять же многострочная лямбда:
let f m1 m2 m3 =
puper.Delay (fun () ->
puper.Bind (m1, fun x1 ->
puper.Bind (m2, fun x2 ->
puper.Bind (m3, fun x3 ->
puper.Return ((x1, x2, x3))))))
Пожалуй, проще всего ориентироваться на последний пример. Я даже боюсь представить себе, как это будет выглядеть на питоне, если попытаться засунуть все в одну строку, как того требует его конструкция lambda... Или есть другой способ?