Entry tags:
shift/reset
λxy.yx
Right? Seems like half-S-combinator.
if (message inscanceof CancellationMessage) { application.cancelnahren(); } else if (message instanceof EncouragementMessage) { galera.trabalha(); } // etc
class Message { enum type { CANCEL, ENCOURAGE, DGAF} myType; .... } ... switch(message.type()) { case CANCEL: ... case ENCOURAGE: ... case DGAF: ... }
classmc = message.getClass(); if (mc.equals(CancelMessage.class)) { ... } else if (....
unapply
, а ещё лучше сказать, линза (обратная сторона); с помощью её можно устраивать сравнение по образцу и, в зависимости от типа, выполнять какие-то действия с параметрами конструктора.message match { case CancelMessage(timeout: TimeInSeconds) => app.cancelato(timeout) case EncourageMessage(text: String) => galera.listen(text); galera.trabalha ... }
Option[T]
, Either[Left,Right]
- для них как бы некошерно употреблять кейсы, а надо использовать функциональную функцию map
. В принципе, скальные библиотеки любят возвращать Option[T]
, и тут-то бы и применять map
, да штука в том, что в случае None
ничего ни к чему применяться не будет. Так что приходится расписывать кейс. И со списками, что характерно, кейс приходится писать: как правило, разбивая ситуацию на два случая - пустой список или голова с хвостом, неважно, пустым или нет.Maybe
, или data type.map
? Но блин, это ж надо передавать, вообще говоря, по специальному исполнителю на каждый отдельный жизненный случай. Как в Джаве любят писать - лисинеры, listeners
- они будут теперь здоровкаться на каждый чих.xhr
, а не вызываете что-нибудь там вроде JQuery.doAjaxForMeHurry()
, то у вас как правило два-три таких слушателя: - пока читает, - когда закончили, - если ошибка. А могли бы написать (если б могли)reset { switch { case STILL_READING: ...; break case GOT_RESULT: ...; return case ERROR: ...; return } shift(k) { do { var resp = XHR.doPost(myStuff) k(resp) } } }
<script language="javascript> function reset(f){return {shift:function(g){return g(f)}}} </script>