首页 文章

我可以't understand Wikipedia'定义“applicative functor”

提问于
浏览
12

在Haskell中学习仿函数,应用函子和monad,我在Wikipedia找到了这个定义:

在函数式编程中,特别是Haskell,一个applicative functor是一个结构,就像一个没有连接的monad(return,fmap,join),或者像带有return的functor .

我无法理解:在我看来,将 return (即 pure )提供给仿函数并不足以获得一个应用仿函数,因为你需要提供 ap (即 <*> ),这也不能用 fmap 来定义仅 return . 我错过了什么或维基百科的定义不是绝对正确的吗?

编辑2017-02-08:我在this答案中找到了关于这个问题的其他有用的见解 .

2 回答

  • 9

    这篇文章不正确 . 假设我们有一个monad m 没有 join ,或者一个带有 return 的仿函数 . 我们可以立即定义 pure

    pure :: Monad m => a -> m a
    pure = return
    

    但是,我们不能仅使用 fmapreturn 定义 (<*>) . 我们所拥有的只是 fmap ,所以如果我们尝试使用 m (a -> b) ,我们最终会得到 m (m a) . 那时我们需要 join 或等价的 (>>=)

    (<*>) :: Monad m => m (a -> b) -> m a -> m b
    f <*> x = join (fmap (flip fmap x) f)
    
    -- or, easier to read:
    -- f <*> x = do
    --   f' <- f
    --   x' <- x
    --   return f' x'
    

    应用程序仿函数就像一个带有 returnap 的仿函数,但没有 join . 所以,是的,你是完全正确的,维基百科错过了申请的运作(见the original paper) .

    顺便说一句,如果你只添加 pure ,你得到pointed functor . 尽管如此,typeclassopedia提供了比维基百科文章更好的概述 Applicative .

  • 7

    你是对的,应用函子需要 <*> 以及 pure 来获得最小的定义 . 值得注意的是,我们可以从这些中得到 fmap ,但是:

    fmap f a = pure f <*> a
    

    同样,我们可以从monad获得适用的定义:

    pure = return
    f' <*> a' = do
        f <- f'
        a <- a'
        return $ f a
    

    您可以查看applicatives仿函数,将仿函数概括为多参数函数,或者将值与水平上下文组合:

    liftA2 f a b = f <$> a <*> b
    fmap :: (a -> b) -> (f a -> f b)
    liftA2 :: (a -> b -> c) -> (f a -> f b -> f c)
    

相关问题