Это просто чистая функция. Эквивалентный код Haskell:
maybe :: (a -> Bool) -> (a -> b) -> a -> Maybe b
maybe p f x = if p x then Just (f x) else Nothing
example = maybe p f x
Для этой функции нет специального названия. Тем не менее, она может быть упрощена:
maybe :: Bool -> b -> Maybe b
maybe b y = if b then Just y else Nothing
example = (maybe <$> p <*> f) x
Обратите внимание, что p :: a -> Bool
, f :: a -> b
и maybe p f :: a -> Maybe b
все имеют одну общую черту (т.е. ((->) a)
). Это интерфейс Reader
, и его можно абстрагировать, используя класс типа Applicative
, что и я сделал.
Однако, это не очень хороший код. Лучше абстракция будет:
maybe :: (a -> Maybe b) -> (b -> c) -> a -> Maybe c
maybe p f = fmap f . p
Обратите внимание, что p :: a -> Maybe b
теперь Kleisli arrow вместо простой функции предиката. Мы переместили условную логику из функции maybe
. В JavaScript код будет теперь:
isFoo(args).map(doSomething);
Все, что вам нужно сделать, это определить тип данных Maybe
и реализовать свой Functor
интерфейс:
function Maybe(constructor) {
this.constructor = constructor || this;
}
var Nothing = new Maybe;
function Just(value) {
var maybe = new Maybe(Just);
maybe.value = value;
return maybe;
}
Maybe.prototype.map = function (functor) {
switch (this.constructor) {
case Nothing: return Nothing;
case Just: return Just(functor(this.value));
}
};
Конечно, вам также необходимо будет пересмотреть isFoo
, как следующим образом:
function isFoo(args) {
return args.isFoo() ? Just(args) : Nothing;
}
функция doSomthing
может оставаться как есть. Надеюсь, это поможет.
Идиома, которую вы ищете, является интерфейсом Functor
.
Как и я, я напишу условие 'doSomething()' получение вызова в имя функции. –
Вы ищете соглашения об именах или технику программирования? – Bergi
Техника программирования Я полагаю. Меня интересует реализация условного в «функциональном» стиле. – Ben