Haskell 标准库中是否有(a->b)->((可能是a)->(可能是b))转换器?

Haskell 标准库中是否有(a->b)->((可能是a)->(可能是b))转换器?,haskell,maybe,Haskell,Maybe,我正在学习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

我正在学习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
但后来我觉得这个转换器似乎对很多不同的情况都很有用,它一定在某个地方的标准库中——但是,我找不到它


它在标准图书馆吗?编写这样的代码的正确方法是什么,必须在一个链中的值上链一个函数,而这些值可能是一个Maybe?

是的,这是fmap。将来您可以通过转储函数的类型来发现这种情况,这将为您建议的类型提供fmap作为其第一个结果。

是的,这是fmap。将来,您可以通过转储函数的类型来发现这种情况,这将为您建议的类型提供fmap作为其第一个结果。

这只是fmap,可能使用标准的Functor实例。请参阅,以获得良好的介绍,包括Maybe实例。是的,它是标准库不可分割的一部分。不幸的是@RobinZigmond的评论被高估了,因为这是一个糟糕的评论。另一方面,这是一个很好的答案,所以也许应该在下面输入答案。说真的,评论是为了寻求澄清。在评论中回答问题会留下一些半开放式的问题,这会降低网站的价值。如果你认为一个问题不能得到真正的答案,那就不要回答它。让别人做吧。如果你有答案,就把它当作真正的答案,放在答案所在的地方。抱歉@K.a.Buhr,如果我能很快地说出来,我倾向于评论而不是回答,特别是当我在聚会上看孩子,在手机上浏览时,时间紧迫。我认为像这样的简单简单的事情比完全的答案更值得评论,这将给我的名声,我认为不值得,因为几乎所有其他人都能读到同样的答案。@ RobinZigmond,请注意开始撰写评论时出现在评论框中的说明:使用评论询问更多信息或提出改进建议。避免在评论中回答问题。这也在Meta中讨论过。如果你对获得不应有的代表感到不安,那么将问题留给低代表用户回答@K.A.Buhr…我想我可能终于找到了一个=也就是说,我和偶尔在评论中回答的任何人一样有罪。这非常诱人,尤其是当答案只有一个单词时。这就是fmap,使用标准的函子实例。请参阅,以获得良好的介绍,包括Maybe实例。是的,它是标准库不可分割的一部分。不幸的是@RobinZigmond的评论被高估了,因为这是一个糟糕的评论。另一方面,这是一个很好的答案,所以也许应该在下面输入答案。说真的,评论是为了寻求澄清。在评论中回答问题会留下一些半开放式的问题,这会降低网站的价值。如果你认为一个问题不能得到真正的答案,那就不要回答它。让别人做吧。如果你有答案,就把它当作真正的答案,放在答案所在的地方。抱歉@K.a.Buhr,如果我能很快地说出来,我倾向于评论而不是回答,特别是当我在聚会上看孩子,在手机上浏览时,时间紧迫。我认为像这样的简单简单的事情比完全的答案更值得评论,这将给我的名声,我认为不值得,因为几乎所有其他人都能读到同样的答案。@ RobinZigmond,请注意开始撰写评论时出现在评论框中的说明:使用评论询问更多信息或提出改进建议。避免在评论中回答问题。这也在Meta中讨论过。如果你对获得不应有的代表感到不安,那么将问题留给低代表用户回答@K.A.Buhr…我想我可能终于找到了一个=也就是说,我和偶尔在评论中回答的任何人一样有罪。这是难以置信的诱惑,尤其是当答案只有一个字的时候。