Рассмотрим эту liftA2
функцию:
liftA2 :: (Maybe a -> Maybe b -> Maybe c) -> Maybe a -> Maybe b -> Maybe c
liftA2 f Nothing Nothing = Nothing
liftA2 f (Just x) Nothing = Nothing
liftA2 f Nothing (Just y) = Nothing
liftA2 f (Just x) (Just y) = f x y
Это эквивалентно действительной liftA2
функции из Control.Applicative
, но специализированной для Maybe
. (а также liftM2
из Control.Monad
)
Я ищу двоюродного брата этой функции, которая работает следующим образом:
mystery :: (Maybe a -> Maybe a -> Maybe a) -> Maybe a -> Maybe b -> Maybe c
mystery f Nothing Nothing = Nothing
mystery f (Just x) Nothing = Just x
mystery f Nothing (Just y) = Just y
mystery f (Just x) (Just y) = Just (f x y)
Ближайшая концепция, о которой я знаюравен <|>
, но отбрасывает второе значение , если их два, тогда как я бы предпочел передать функцию для их объединения.
Как называется эта загадочная функция? На какой тип класса он работает? Какие условия я могу узнать в Google? Спасибо!