Есть ли в стандартной библиотеке конвертер (а - ›б) -› ((Может быть) - ›(Может быть б))?

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

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

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


person Max Yankov    schedule 20.04.2019    source источник
comment
Это просто fmap, используя стандартный Functor экземпляр для Maybe. (См. Learnyouahaskell.com/ для хорошее введение, включая экземпляр Maybe.) Так что да, это неотъемлемая часть стандартной библиотеки.   -  person Robin Zigmond    schedule 20.04.2019
comment
К сожалению, за комментарий @ RobinZigmond проголосовали, потому что это ужасный комментарий. С другой стороны, это хороший ОТВЕТ, поэтому, возможно, его следовало ввести ниже, где идут ОТВЕТЫ. Серьезно, комментарии нужны для получения разъяснений. Ответы на вопросы в комментариях оставляют множество полуоткрытых вопросов, которые снижают ценность сайта. Если вы считаете, что вопрос не требует реального ответа, не отвечайте на него. Пусть это сделает кто-то другой. Если у вас есть ответ, относитесь к нему как к настоящему ответу и помещайте туда, куда нужно.   -  person K. A. Buhr    schedule 20.04.2019
comment
Извините, @ K.A.Buhr, я предпочитаю комментировать, а не отвечать, если это что-то, что я могу сказать быстро, особенно когда я тороплюсь (наблюдал за детьми на вечеринке, просматривая SO на моем мобильном телефоне). Я считаю, что такие быстрые простые вещи более достойны комментариев, чем полные ответы, которые дадут мне репутацию, которую я считаю не заслуженной (поскольку почти любой другой, читающий это, мог бы дать такой же ответ).   -  person Robin Zigmond    schedule 20.04.2019
comment
Но я все еще относительно новичок в участии в SO, если есть какое-то правило, которое гласит, что такие вещи должны быть ответом, я постараюсь сделать это в будущем.   -  person Robin Zigmond    schedule 20.04.2019
comment
@RobinZigmond, обратите внимание на инструкции, которые появляются в поле для комментариев, когда вы начинаете писать комментарий: используйте комментарии, чтобы запросить дополнительную информацию или предложить улучшения. Не отвечайте на вопросы в комментариях. Это также обсуждалось в Meta (https://meta.stackoverflow.com/questions/253045/answerers-who-only-use-comments). Если вам не нравится получать незаслуженную репутацию, оставьте вопрос пользователю с низкой репутацией!   -  person K. A. Buhr    schedule 20.04.2019
comment
... как @DanielWagner. Он годами пытался найти достаточно простой вопрос, на который он мог бы ответить! ;)   -  person K. A. Buhr    schedule 20.04.2019
comment
@ K.A.Buhr ... и я думаю, что наконец нашел его! = D Тем не менее, я так же виноват, что иногда отвечаю в комментариях. Это невероятно заманчиво, особенно когда ответ состоит из одного слова.   -  person Daniel Wagner    schedule 20.04.2019


Ответы (1)


Да, это fmap. Вы можете открыть для себя подобные вещи в будущем, сбросив тип своей функции в Hoogle, что дает fmap в качестве первого результата для предложенного вами типа.

person Daniel Wagner    schedule 20.04.2019