在 Haskell 中将函数更改为 Maybe 函数

Changing function to Maybe function in Haskell

是否可以编写一个函数,它采用 (Something -> Something) 和 returns 之类的函数,但类型为 (Maybe Something -> Maybe Something)

例如:

f :: Point -> Point
f x = [some code goes here]

makeItMaybe :: (Point -> Point) -> (Maybe Point -> Maybe Point)
makeItMaybe x = ???

我知道它与 Monads 和 Applicatives 有关,但无法真正弄清楚如何。我试了一下 <*><$>,但没有得到任何结果。

如能提供正确方向的帮助或指示,我们将不胜感激。谢谢!

这个函数满足签名,不知道是不是你想要的:

makeItMaybe :: (a -> a) -> (Maybe a -> Maybe a)
makeItMaybe f (Just x) = Just (f x)
makeItMaybe f Nothing  = Nothing

正如@baxbaxwalanuksiwe 和@Lee 所指出的,它是 Functor 类型类中 Maybefmap 实例。

我认为您正在查找类型为 Functor f => (a -> b) -> f a -> f bfmap。如果将 f 替换为 Maybe(因为 Maybe 是一个仿函数)并将括号放在正确的位置,您会得到 (a -> b) -> (Maybe a -> Maybe b)。您使用 (<$>) 的方向是正确的,它只是 fmap.

的别名

所以我们有 makeItMaybe f x = fmap f x,或者更简单地说,makeItMaybe = fmap

你想要的函数是fmap:

makeItMaybe = fmap

fmapFunctor 类型类定义:

fmap :: Functor f => (a -> b) -> f a -> f b

Maybe 有一个仿函数实例,所以 fmap 专用于 Maybe 有类型

(a -> b) -> Maybe a -> Maybe b