给定一个偏函数f
和一个参数列表,xs
我正在寻找定义的对列表。这似乎是一件很自然的事情,但到目前为止我还没有优雅地表达它。我想知道 Maybe/Monad/Applicative/... 区域是否有什么可以提供帮助的?以下工作,但似乎有点明确。(x, f(x))
f
import Data.Maybe (mapMaybe)
graph :: (a -> b) -> [a] -> [(a, b)]
graph f = map (\x -> (x, f x))
liftMaybe :: (a, Maybe b) -> Maybe (a, b)
liftMaybe (x, Just y) = Just (x, y)
liftMaybe (_, Nothing) = Nothing
partialgraph :: (a -> Maybe b) -> [a] -> [(a, b)]
partialgraph f = mapMaybe liftMaybe . graph f
是否liftMaybe
存在其他名称?我发现了其中一些的以下重新表述:
import Control.Monad (ap)
graph' :: (a -> b) -> [a] -> [(a, b)]
graph' = map . ap (,)
liftMaybe' :: (a, Maybe b) -> Maybe (a, b)
liftMaybe' (a, mb) = do
b <- mb
return (a, b)
liftMaybe'' :: (a, Maybe b) -> Maybe (a, b)
liftMaybe'' (a, mb) = fmap ((,) a) mb
liftMaybe''' :: (a, Maybe b) -> Maybe (a, b)
liftMaybe''' = uncurry (fmap . (,))