提升(在函数式编程环境中)与范畴论有何关系?

2024-03-27

看着Haskell http://www.haskell.org/haskellwiki/Lifting文档,提升似乎基本上是一个概括fmap,允许映射具有多个参数的函数。

The 维基百科 http://en.wikipedia.org/wiki/Lift_%28mathematics%29然而,有关提升的文章给出了不同的观点,根据范畴中的态射定义“提升”,以及它与该范畴中的其他对象和态射的关系(我不会在这里给出详细信息)。我认为,如果我们考虑 Cat(范畴的范畴,从而使我们的态射成为函子),这可能与 Haskell 的情况相关,但我看不出这种提升的范畴论概念与 Haskell 中的概念有何关系基于链接的文章,如果有的话。

如果这两个概念并不真正相关,只是有一个相似的名称,那么 Haskell 中是否使用了 Lifts(范畴论)?


提升和扩展的双重概念在 Haskell 中绝对被使用,也许最突出的是以共生的形式extend和单子bind。 (令人困惑的是,extend是提升,而不是扩展。)comonadw's extend让我们取一个函数w a -> b并把它举起来extract :: w b -> b获取地图w a -> w b。在 ASCII 艺术中,给出图表

        w b
         |
         V
w a ---> b

其中垂直箭头是提取,extend给我们一个对角箭头(使图表通勤):

     -> w b
    /    |
   /     V
w a ---> b

大多数 Haskellers 更熟悉的是双重概念bind (>>=) 对于一个单子m。给定一个函数a -> m b and return :: a -> m a,我们可以“扩展”我们的功能return得到一个函数m a -> m b。在 ASCII 艺术中:

a ---> m b
|
V
m a

gives us

a ---> m b
 |  __A
 V /
m a

(That A是一个箭头!)

So yes, extend could have been called lift, and bind could have been called extend. As for Haskell's lifts, I have no idea why they're called that!

编辑:实际上,我再次认为,哈斯克尔lifts 实际上是扩展。如果f是适用的,我们有一个函数a -> b -> c,我们可以用以下方式编写这个函数pure :: c -> f c得到一个函数a -> b -> f c。非柯里化,这与函数相同(a, b) -> f c。现在我们也可以打(a, b) with pure得到一个函数(a, b) -> f (a, b)。现在,由fmaping fst and snd,我们得到一个函数f (a, b) -> f a and f (a, b) -> f b,我们可以将其组合起来得到一个函数f (a, b) -> (f a, f b)。与我们一起作曲pure从之前给出(a, b) -> (f a, f b)。唷!回顾一下,我们有 ASCII 艺术图

  (a, b) ---> f c
    |
    V
(f a, f b)

Now liftA2给我们一个函数(f a, f b) -> f c,我不会画它,因为我厌倦了制作糟糕的图表。但重点是,该图是通勤的,所以liftA2实际上给了我们水平箭头沿着垂直箭头的延伸。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提升(在函数式编程环境中)与范畴论有何关系? 的相关文章

  • Cabal 在 NixOS 上构建时找不到外部库

    我正在尝试使用 cabal2nix 在 NixOS 上构建一个内部 Haskell 项目 它包装 并因此依赖 一个外部库 在 Ubuntu 上可以通过以下方式构建 wget设置源 然后运行make make install ldconfig
  • 在 Haskell 中编写 Web 应用程序的最简单方法是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在我的项目中更多地使用 Haskell 并且我认为如果我可以开始将它用于 Web 应用程序 这将真正
  • 如何制作Applicative的固定长度向量实例?

    最近了解了推广 决定尝试写向量 LANGUAGE DataKinds GADTs KindSignatures module Vector where data Nat Next Nat Zero data Vector Nat gt gt
  • Foldl 是否比其严格的表亲 Foldl' 更好?

    Haskell 有两个列表左折叠函数 foldl 以及 严格 版本 foldl 不严格的问题foldl是它建造了一座重击塔 foldl 0 1 5 gt 0 1 2 3 4 5 gt 15 这会浪费内存 并且如果列表中的项太多 可能会导致堆
  • Accelerate 和 Repa 是否有不同的用例?

    我一直在玩 Repa 和 Accelerate 它们都很有趣 但我不知道何时使用其中一个 何时使用另一个 他们是一起成长 是竞争对手 还是只是为了解决不同的问题 Repa 是一个用于高效数组构建和遍历的库 用 Haskell 编程并在 Ha
  • 使用通用元组函数一次进行多次折叠

    如何编写一个接受类型函数元组的函数ai gt b gt ai并返回一个函数 该函数接受类型元素的元组ai 类型的一个元素b 并将每个元素组合成一个新的元组ai 那是签名应该是这样的 f a1 gt b gt a1 a2 gt b gt a2
  • 函数式编程是否需要新的命名约定?

    我最近开始使用 Haskell 学习函数式编程 并在 Haskell 官方 wiki 上发现了这篇文章 如何阅读哈斯克尔 http www haskell org haskellwiki How to read Haskell What t
  • 我可以获得有关过度限制类型签名的警告吗?

    当我为可能更具多态性的函数提供类型签名时 GHC 或某些 lint 工具可以告诉我吗 GHC 不这样做 快速搜索 Hackage 也没有发现任何结果 实现这样的事情的一个简单但可能非常有效的方法是在 GHCi 中加载模块 使用 browse
  • 通过 Emacs 评估 ghci 或 Hugs 中的缓冲区

    在 Emacs 中使用 sml mode 我已经能够使用以下命令将缓冲区内容直接发送到较差的 SML 进程C c C b 现在我只想用 Haskell 做同样的事情 Haskell 模式似乎不支持这一点 所以我想知道 使用 Emacs 和
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • ErrorT 已弃用,但 exceptT 不适合

    我有一个一元计算 在某些时候 由于单子模式匹配 它开始需要 MonadFail 约束 我的简单解决方法是使用以下命令运行它 fmap either error id runErrorT 然而哎呀 Deprecated Use Control
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 无点镜头创建不进行类型检查

    在函数中test 我遍历一个列表 从它的成员生成镜头 然后打印一些数据 当我使用有针对性的呼叫风格时 这会起作用 当我使其成为无点时 它无法进行类型检查 为什么会出现这种情况 我该如何解决这个问题 在我看来 GHC 并没有保留排名较高的信息
  • 我应该在 Turtle 或 Foldl 包中使用折叠吗?

    我在使用 Turtle 时遇到了一些困难 直到盯着难以理解的错误消息几分钟后才意识到我使用了错误的fold功能 https hackage haskell org package turtle 1 5 8 docs Turtle Shell
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • Haskell,堆栈:找到可执行文件

    我正在寻找类似的东西 stack whereis hasktags where whereis行为或多或少类似于 UNIXwhereis命令 hasktags是这样运行的 stack exec hasktags stack exec whe
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • 如何在 Haskell 中安装库?

    我尝试使用控制 Monad Extra andM https hackage haskell org package extra 1 7 10 docs Control Monad Extra html import Control Mon

随机推荐