标准库中是否有(a-> b)->((也许a)->(也许b))转换器?

Max*_*kov 1 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)  = Just (eval x)
Run Code Online (Sandbox Code Playgroud)

第二个函数似乎有点多余,所以我写了一个转换器:

toMayBe :: (a -> b) -> Maybe a -> Maybe b
toMayBe _ Nothing   = Nothing
toMayBe f (Just x)  = Just (f x)
Run Code Online (Sandbox Code Playgroud)

并将功能重写为

evalMayBe :: Maybe ExprT -> Maybe Integer
evalMayBe = toMayBe eval
Run Code Online (Sandbox Code Playgroud)

但是后来我认为这个转换器似乎在许多不同情况下都非常有用,以至于它必须存在于标准库中的某个位置-但是,我找不到它。

它在标准库中吗?编写这样的代码的“正确”方法是什么,即您必须将函数链接在值可能是Maybe的链中?

Dan*_*ner 7

是的,这是fmap。将来,您可以通过将函数的类型转储到Hoogle中来自己发现这种事情,这fmap是您建议的类型的第一个结果。