我无法理解这个函数中发生了什么。我的理解是fmap f x返回一个接受最后一个参数的函数y。但是什么时候y“喂”到fmap f xcase 语句里面?
func :: (Num a, Num b) => (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c
func f x y = case fmap f x of
Nothing -> Nothing
Just z -> fmap z y
Run Code Online (Sandbox Code Playgroud)
对于Maybe,函子实例定义为:
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just x) = Just (f x)
Run Code Online (Sandbox Code Playgroud)
所以对于f ~ Maybe,fmap是专门来的fmap :: (g -> h) -> Maybe g -> Maybe h。
在您的特定情况下,f具有 signaturef :: a -> b -> c或更详细的ff :: a -> (b -> c)。所以这意味着对于我们的签名fmap,我们获得:
fmap :: (g -> h ) -> Maybe g -> Maybe h
f :: a -> (b -> c)
----------------------------------------------
g ~ a, h ~ (b -> c)
Run Code Online (Sandbox Code Playgroud)
所以这意味着fmap f x将有 type fmap f x :: Maybe (b -> c)。因此它是 aMaybe包装了一个类型为 的函数b -> c。
因此,在这里我们可以检查是否fmap f x为 a Just z,在这种情况下z,类型为z :: b -> c, or Nothing。
如果它是 a Just z,我们因此可以执行另一个fmapwith z,从而获得 a Maybe c。