繁体   English   中英

函子上的 Fmapping

[英]Fmapping over functors

假设我有以下代码:

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) 并且结果将被包装在LiftItOut中。 我在 learnyouahaskell 上读到了关于(->r)仿函数的内容,尽管它并没有引起我的共鸣。 感谢任何帮助

你是对的,你会到达LiftItOut (fmap (\x -> 3 x) (+3)) ,并且你正确地确定了感兴趣的包装函子是 function 函子(注意(r ->)仿函数,而不是(-> r)仿函数),但你从那里的推理有点草率。 回想一下,对于函数,我们有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的参数,它实际上不是 function。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM