给定一个部分函数 f
和一个参数列表 xs
,我想要找到一组有序对 (x, f(x))
,其中 f
是被定义的。这似乎是一件很自然的事情,但是到目前为止,我还没有找到一个优雅的表达方式。我想知道在 Maybe/Monad/Applicative/... 这些领域中是否有任何可以帮助的东西?以下代码可以工作,但它似乎有点显式。
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 . (,))
preservingF
类型签名中缺少一个参数。如果是这样的话,它与traverse
非常相似(如果您不介意使用Applicative
约束而非Functor
):preservingF f x = traverse f (x, x)
。 - David Young