Есть ли в стандартной библиотеке конвертер (a -> b) -> ((может быть) -> (может быть, б))? - PullRequest
1 голос
/ 20 апреля 2019

Я только изучаю 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

Но потом я подумал, что этот конвертер оказался настолько полезным для стольких различных ситуаций, что он должен быть где-то в стандартной библиотеке - однако я не смог его найти.

Это в стандартной библиотеке? И каков «правильный» способ написания кода, подобного этому, где вы должны связать функцию в цепочке значений в цепочке, где эти значения могут быть «Возможно»?

1 Ответ

7 голосов
/ 20 апреля 2019

Да, это fmap. Вы можете открыть для себя подобные вещи в будущем, сбросив тип вашей функции +b%29+->+Maybe+a+->+Maybe+b" rel="noreferrer"> в Hoogle , что дает fmap в качестве первого результата для предложенного вами типа.

...