我刚刚学习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
。你可以通过转储函数into Hoogle的类型来为自己发现这种事情,它将fmap
作为你提出的类型的第一个结果。