我很难理解这个函数是怎么回事。我的理解是,fmap f x返回一个接受最后一个参数y的函数。但是,在case语句中,y何时被“馈送”给fmap f x呢?
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发布于 2020-01-15 03:26:47
对于Maybe,函数器实例定义为:
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just x) = Just (f x)因此,对于f ~ Maybe,fmap是专门针对fmap :: (g -> h) -> Maybe g -> Maybe h的。
在您的特定情况下,f具有签名f :: a -> b -> c或更详细的ff :: a -> (b -> c)。这意味着对于我们的fmap签名,我们获得:
fmap :: (g -> h ) -> Maybe g -> Maybe h
f :: a -> (b -> c)
----------------------------------------------
g ~ a, h ~ (b -> c)所以这意味着fmap f x的类型将是fmap f x :: Maybe (b -> c)。因此,它是一个包装b -> c类型的函数的Maybe。
因此,我们可以在这里检查fmap f x是否为Just z,在这种情况下,z的类型为z :: b -> c或Nothing。
如果它是一个Just z,那么我们可以使用z执行另一个fmap,从而获得一个Maybe c。
https://stackoverflow.com/questions/59740388
复制相似问题