gpt4 book ai didi

math - 为什么 Functor 类没有返回函数?

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

从分类的角度来看,仿函数是一对两个映射(一个在对象之间,另一个在类别箭头之间),遵循一些公理。

我假设,每个 Functor 实例都类似于数学定义,即可以映射对象和函数,但 Haskell 的 Functor类只有函数fmap映射功能。

为什么这样?

更新 换句话说:

每个 Monad 类型 M有一个功能return :: a -> M a .

和 Functor 类型 F没有功能return :: a -> F a , 但仅限 F x构造函数。

最佳答案

首先,有两个层次:类型和值。由于 Hask 的对象是类型,您只能使用类型构造函数来映射它们,类型构造函数具有 * -> *种类:

  • α -> F α (对于 Functor F ),
  • β -> M β (对于 Monad M)。

  • 然后对于仿函数,您需要一个关于态射的映射(即函数,它们是值):它只是 fmap :: (α -> β) -> (F α -> F β) .

    到目前为止,我想,我并没有说什么新东西。但重要的是 return :: α -> M αMonad不是 α 类型的映射器到 M α如您所想。关于单子(monad)的数学定义, return对应于自然变换 来自 Id M 的仿函数仿函数。只是这个 Id仿函数是一种隐含的。 monad 的标准定义还需要另一个自然变换 M ◦ M -> M .所以把它翻译成 Haskell 就像
    class Functor m => Monad m where
    return :: Id α -> m α
    join :: m (m α) -> m α

    (附带说明:这两个自然变换实际上是单位和乘法,这使得 monad 成为内仿函数类别中的幺半群)

    实际定义不同,但等效。见 Haskell/wiki在那。

    如果您采用从标准绑定(bind) >>= :: m α -> (α -> m β) -> m β 派生的类组合运算符:
    (>=>) :: Monad m => (α -> m β) -> (β -> m γ) -> (α -> m γ)
    f >=> g = \a => f a >>= g

    你可以看到,这一切实际上都是关于 Kleisli category .另见 article on nLab关于计算机科学中的单子(monad)。

    关于math - 为什么 Functor 类没有返回函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21647659/

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