案例语句中的haskell部分应用

dat*_*ose 1 haskell

我无法理解这个函数中发生了什么。我的理解是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)

Wil*_*sem 6

对于Maybe,函子实例定义为:

instance Functor Maybe where
    fmap _ Nothing = Nothing
    fmap f (Just x) = Just (f x)
Run Code Online (Sandbox Code Playgroud)

所以对于f ~ Maybefmap是专门来的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