Comments 21
var a = getData();
if (a != null) {
var b = getMoreData(a);
if (b != null) {
var c = getMoreData(b);
if (c != null) {
var d = getEvenMoreData(a, c)
if (d != null) {
print(d);
}
}
}
}
А монады-то прикольные штуки! Без них вполне читабельное решение влоб и не такой уж и ад (на haskwell не кодил!) :
var a,b,c,d;
if(
((a=getData())!=null)&&
((b=getMoreData(a))!=null)&&
((c=getMoreData(b))!=null)&&
((d=getEvenMoreData(a,c))!=null)
)
{
print(d);
}
Автор немного лукавит)
Тут дело скорее не в самих монадах, а в do-notation.
При использовании монад всплывают вложенные монады, state-монады с несовместимыми типами, монадические трансформеры....
И можно готовить следующую статью:
Избегание ада монад с помощью ???
[RWST r w s (MaybeT (ErrorT IO)) a]
Какой у Вас резкий переход в примерах проверки на null. От JavaScript, CoffeeScript к Haskell. Например на том же JavaScript можно использовать Maybe как функтор, проверку на null и undefined спрятать в метод map. А если еще упростить
или на ES6
Вроде как корректный функтор, который можно использовать при цепочечных вызовах функции, но такого сахара как do конечно не будет. Сидя в JS к прекрасному тоже можно стремится
function mayBe(value, fn) {
return value === null || value === undefined ? value : fn(value)
}
или на ES6
const mayBe = (v, f) => v === null || v === undefined ? v : f(v)
Вроде как корректный функтор, который можно использовать при цепочечных вызовах функции, но такого сахара как do конечно не будет. Сидя в JS к прекрасному тоже можно стремится
проверка на null
Можно использовать старый добрый try-catch:
var a = getData()
try {
var b = getMoreData(a)
var c = getMoreData(b)
var d = getEvenMoreData(a, c)
print(d)
}
catch (NullPointerException ex) { ... }
for-цикл
Зачем столько скобочек? Без скобочек всё выглядит также, как и со списковым включением:
for (var a in getData())
for (var b in getMoreData(a))
for (var c in getMoreData(b))
for (var d in getMoreData(c))
print(d)
Но тут скорее всего стоит как-то перепроектировать систему и повысить уровень абстракции.
Ад проверки на null
да прибудет с вами early return
UFO just landed and posted this here
А как грамотно обрабатывать общение с устройствами, например, при работе с libusb? Сначала ищем устройство, открываем его, потом claim interface, потом опционально, шлём тестовый пакет. На каждом шаге можем обломиться, и для каждого шага потребуется своё освобождение ресурсов. Стандартный подход — в разной степени замаскированный switch+goto по меткам, с ручкой проверкой каждого шага обращения к устройству
Sign up to leave a comment.
Избегание ада с помощью монад