gpt4 book ai didi

haskell - (fmap.fmap) 适用于

转载 作者:行者123 更新时间:2023-12-01 10:25:03 25 4
gpt4 key购买 nike

fmap.fmap允许我们“深入两层”进入仿函数:

fmap.fmap :: (a -> b) -> f (g a) -> f (g b)

这也适用于应用仿函数吗?假设我想合并 Just (+5)[1,2,3]通过使用它们的应用特性。我可以想到一个明显的方法来做到这一点,但对我来说似乎并不那么简单。
(<*>).(<*>)没有确定的类型签名:
((<*>).(<*>)) :: (a1 -> a2 -> b) -> ((a1 -> a2) -> a1) -> (a1 -> a2) -> b
-- where I would expect something like:
-- ((<*>).(<*>)) :: f (g (a -> b)) -> f (g a) -> f (g b)

是否可以撰写 Just (+5)[1,2,3]以这种方式?

编辑:

第一步是选择:
  • pure $ Just (+5)fmap pure [1,2,3] , 或
  • fmap pure (Just (+5)pure [1,2,3]

  • 但我仍然不知道如何撰写这些...

    编辑:

    有一个通用的方法来组合函数会很好 f (g (a -> b)f (g a) ,我不只是在为上述案例寻找解决方案,它只是作为此类函数的示例输入。基本上我想要一个功能:
    (<***>) :: f (g (a -> b)) -> f (g a) -> f (g b)

    最佳答案

    liftA2具有与 fmap 相似的组成特性.

    liftA2 f            ::    f a  ->    f b  ->    f c
    (liftA2 . liftA2) f :: g (f a) -> g (f b) -> g (f c)

    所以你可以写
    (liftA2 . liftA2) ($) (pure (Just (+5))) (fmap pure [1,2,3]) :: [Maybe Integer]

    即, (<***>) = (liftA2 . liftA2) ($) . (很像 (<*>) = liftA2 ($))

    另一种看待它的方式是应用仿函数的组合是一个应用仿函数,这是由 Data.Functor.Compose 来具体化的。 :
    {-# LANGUAGE ScopedTypeVariables, PartialTypeSignatures #-}

    import Data.Functor.Compose
    import Data.Coerce

    (<***>) :: forall f g a b. (Applicative f, Applicative g)
    => f (g (a -> b)) -> f (g a) -> f (g b)
    (<***>) = coerce ((<*>) :: Compose f g (a -> b) -> _)

    点与 coerce是为了表明 (<***>)是适用的 (<*>)对于正确的类型;我们也可以手动解包
    f <***> x = getCompose $ Compose f <*> Compose x

    关于haskell - (fmap.fmap) 适用于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48058053/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com