gpt4 book ai didi

haskell - 值在 Hask 类别中的位置?

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

所以我们有 Hask 的类别,其中:

  • 类型是类别
  • 的对象
  • 函数是范畴中对象到对象的态射。
  • Functor 类似我们有:
  • 类型构造函数作为对象从一个类别到另一个类别的映射
  • fmap用于将态射从一个类别映射到另一个类别。

  • 现在,当我们编写程序时,我们基本上是转换值(而不是类型),似乎 Hask 的 Category 根本不谈论值。我试图在整个方程中拟合值并得出以下观察结果:
  • 每个类型本身就是一个类别。例如: Int 是所有整数的类别。
  • 函数从一个值到另一个值 同类型是范畴的态射。例如:Int -> Int
  • 从一个值到另一个值 的函数不同类型 是将一种类型的值映射到另一种类型的仿函数。

  • 现在我的问题是 - 值在 Hask 的范畴(或一般范畴论)中是否有意义?如果是,那么任何有关阅读它的引用,或者如果不是,那么任何理由。

    我希望这个问题是有道理的:)

    最佳答案

    (除非我 mark it as code,否则我将使用具有数学/范畴论意义的词,而不是编程。)

    一次一个类别

    范畴论的一个重要思想是将大型复杂事物视为一个点,因此,当您考虑类别时,真正形成所有整数的集合/组/环/类/类别被认为是单个点 Hask .

    类似地,你可以有一个非常复杂的整数函数,但它只是被认为是态射集合(集合/类)的单个元素(点/箭头)。

    你在范畴论中做的第一件事就是忽略细节。所以类别 Hask 并不关心 Int 可以被视为一个类别 - 这是在不同的级别。 Int 只是 Hask 中的一个点(对象)。

    低一级

    每个幺半群都是一个具有一个对象的范畴。让我们用那个。

    整数是如何分类的?

    对此有不止一个答案(因为整数是加法下的幺半群和乘法下的幺半群)。让我们做加法:

    您可以将整数视为具有单个对象的类别,而态射是诸如 (+1)、(+2)、(减去 4)之类的函数。

    您必须牢记我将整数 7 视为数字 7,但使用表示 (+7) 使其看起来像是一个类别。范畴论的刻意规律不要说你的态射必须是函数,但更清楚的是,如果某个东西具有一组包含恒等且在组合下封闭的函数的结构,那么它就是一个范畴。

    任何幺半群都以与我们刚刚对整数所做的相同的方式创建一个单对象类别。

    来自整数的仿函数?

    一个函数f从整数作为类别下的操作+ , 到其他类型的操作 £如果您有 f(x+y) = f(x) £ f(y),那么形成类别的只能是仿函数. (这称为幺半群同态)。大多数函数不是态射。

    示例态射
    String s 是 ++ 下的幺半群,所以它们是一个类别。

    len :: String -> Int
    len = length
    len是来自 String 的幺半群态射至 Int , 因为 len (xs ++ ys) = len xs + len ys ,所以如果你正在考虑 ( String , ++ ) 和 ( Int , + ) 作为类别, len是一个仿函数。

    示例非态射

    ( Bool , || ) 是幺半群,具有 False作为身份,所以它是一个单一对象的类别。功能
    quiteLong :: String -> Bool
    quiteLong xs = length xs > 10

    不是态射,因为 quiteLong "Hello "FalsequiteLong "there!"也是 False ,但是 quiteLong ("Hello " ++ "there!")True , 和 False || False不是 True .

    因为 quiteLong不是态射,也不是仿函数。

    你的意思是什么,安德鲁?

    我的观点是 一些 Haskell 类型可以被视为类别,但并非它们之间的所有函数都是形态主义。

    我们不会同时考虑不同级别的类别(除非您出于某种奇怪的目的使用这两个类别),并且故意没有级别之间的理论交互,因为故意没有关于对象和态射的细节。

    这部分是因为范畴论在数学中兴起,提供了一种语言来描述伽罗瓦理论在有限群/子群和域/域扩展之间的可爱相互作用,这两种明显完全不同的结构结果证明是密切相关的。后来,同调/同伦理论使拓扑空间和群之间的仿函数变得既迷人又有用,但主要的一点是,在仿函数的两个范畴中,对象和态射允许彼此非常不同.

    (通常范畴论以从 Hask 到 Hask 的仿函数的形式进入 Haskell,所以在函数式编程的实践中,这两个范畴是相同的。)

    那么......原始问题的答案究竟是什么?

    • Each Type is a category itself. Ex: Int is a category of all integers.


    如果您以特定方式考虑它们。有关详细信息,请参阅 PhilipJF 的回答。

    • Functions from a value to another value of same type are morphism of the category. Eg: Int -> Int


    我认为你混淆了两个级别。函数可以是 Hask 中的态射,但不是所有函数 Int -> Int是加法结构下的仿函数,例如 f x = 2 * x + 10不是 Int 和 Int 之间的仿函数,所以它不是从 ( Int , + ) 到 ( Int , + ) 的范畴态射(仿函数的另一种说法)而是一个态射|在 Hask 类别中。

    • Functions from one value to another value of different type are functor for mapping values of one type to another.


    不,并非所有函数都是仿函数,例如 Int -> Int不是。

    Do values even make sense in the Category of Hask (or in general category theory)?



    类别在类别论中没有值,它们只有对象和态射,它们被视为顶点和有向边。对象不必具有值,并且值不是范畴论的一部分。

    关于haskell - 值在 Hask 类别中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17380379/

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