haskell 函子上的FMap

hivapdat  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(132)

假设我有以下代码:

data LiftItOut f a = LiftItOut (f a)
    deriving Show

instance (Functor fct) => Functor (LiftItOut fct) where
    fmap f (LiftItOut fctor) = LiftItOut (fmap f fctor)

如果我尝试调用fmap (\x-> 3 x) (LiftItOut (+3)),它不工作。但是,它工作不是很有意义吗?结果将是LiftItOut (fmap (\x ->3 x) (+3)),并且,正如我所看到的,3将被馈送到(+3),结果将被 Package 在LiftItOut中。我在learnyouahaskell上读到了 (-〉r) 函子,尽管它没有引起我的兴趣。感谢任何帮助

xesrikrc

xesrikrc1#

你是对的,因为你会得到LiftItOut (fmap (\x -> 3 x) (+3)),你正确地识别出感兴趣的 Package 函子是函数函子(注意,是(r ->)函子,不是(-> r)函子),但是你从那里开始的推理有点草率,回想一下for functions,我们有fmap = (.),所以:

LiftItOut (fmap (\x -> 3 x) (+3))
= { fmap = (.) }
LiftItOut ((\x -> 3 x) . (+3))
= { f . g = \y -> f (g y) }
LiftItOut (\y -> (\x -> 3 x) ((+3) y))
= { section application }
LiftItOut (\y -> (\x -> 3 x) (y + 3))
= { lambda application }
LiftItOut (\y -> 3 (y + 3))

...不 * 完全 * 的结果,你以为你会得到,我敢打赌!并希望在这个简化的形式,它更清楚地为什么这是不是真的明智:y + 3可能足够明智,但您试图将其作为3的参数提供,而3实际上并不是一个函数。

相关问题