Я только изучаю 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
Но потом я подумал, что этот конвертер кажется настолько полезным для стольких разных ситуаций, что он должен быть где-то в стандартной библиотеке - однако я не смог его найти.
Это в стандартной библиотеке? И каков «правильный» способ написать такой код, когда вы должны связать функцию со значениями в цепочке, где эти значения могут быть «Может быть»?
fmap
, используя стандартныйFunctor
экземпляр дляMaybe
. (См. Learnyouahaskell.com/ для хорошее введение, включая экземплярMaybe
.) Так что да, это неотъемлемая часть стандартной библиотеки. - person Robin Zigmond   schedule 20.04.2019