Я только изучаю Haskell, и я обнаружил, что пишу этот кусок кода для домашнего задания:
eval :: ExprT -> Integer
eval (Lit x) = x
eval (Add x y) = (eval x) + (eval y)
eval (Mul x y) = (eval x) * (eval y)
evalMayBe :: Maybe ExprT -> Maybe Integer
evalMayBe Nothing = Nothing
evalMayBe (Just x) = Just (eval x)
Вторая функция казалась немного избыточной, поэтому я написал конвертер:
toMayBe :: (a -> b) -> Maybe a -> Maybe b
toMayBe _ Nothing = Nothing
toMayBe f (Just x) = Just (f x)
И переписал функцию так же, как
evalMayBe :: Maybe ExprT -> Maybe Integer
evalMayBe = toMayBe eval
Но потом я подумал, что этот конвертер оказался настолько полезным для стольких различных ситуаций, что он должен быть где-то в стандартной библиотеке - однако я не смог его найти.
Это в стандартной библиотеке? И каков «правильный» способ написания кода, подобного этому, где вы должны связать функцию в цепочке значений в цепочке, где эти значения могут быть «Возможно»?