gpt4 book ai didi

haskell - 泛化 ($),如 Control.Category 泛化 (.)

转载 作者:行者123 更新时间:2023-12-04 13:22:47 28 4
gpt4 key购买 nike

我想概括 ($)喜欢 Control.Category概括(.) ,并且我已经使用本文末尾的代码 (also ideone) 完成了此操作。

在这段代码中,我创建了一个名为 FunctionObject 的类。 .这个类有一个函数($)带有以下签名:

($) :: f a b -> a -> b

自然我做 (->)此类的一个实例,所以 $继续使用普通功能。

但这允许您创建特殊函数,例如,知道它们自己的逆函数,如下例所示。

我已经得出结论,有以下三种可能性之一:
  • 我是第一个想到的。
  • 其他人已经做到了,而我正在重新发明轮子。
  • 这是个坏主意。

  • 选项 1 似乎不太可能,我在 hayoo 上的搜索没有透露选项 2,所以我怀疑选项 3 最有可能,但如果有人能解释为什么会这样,那就太好了。
    import Prelude hiding ((.), ($))
    import Control.Category ((.), Category)

    class FunctionObject f where
    ($) :: f a b -> a -> b

    infixr 0 $

    instance FunctionObject (->) where
    f $ x = f x

    data InvertibleFunction a b =
    InvertibleFunction (a -> b) (b -> a)

    instance Category InvertibleFunction where
    (InvertibleFunction f f') . (InvertibleFunction g g') =
    InvertibleFunction (f . g) (g' . f')

    instance FunctionObject InvertibleFunction where
    (InvertibleFunction f _) $ x = f $ x

    inverse (InvertibleFunction f f') = InvertibleFunction f' f

    add :: (Num n) => n -> InvertibleFunction n n
    add n = InvertibleFunction (+n) (subtract n)

    main = do
    print $ add 2 $ 5 -- 7
    print $ inverse (add 2) $ 5 -- 3

    最佳答案

    $将态射应用于值。值的概念似乎微不足道,但实际上,一般类别不需要这样的概念。态射是值(箭头值......无论如何),但对象(类型)实际上不需要包含任何元素。

    但是,在许多类别中,都有一个特殊的对象,terminal object .在 哈斯克 ,这是()类型。你会注意到函数 () -> a基本上相当于a重视自己。该作品所属的分类称为 well-pointed .所以真的,你需要的基本东西像 $有意义的是

    class Category c => WellPointed c where
    type Terminal c :: *
    point :: a -> Terminal c `c` a
    unpoint :: Terminal c `c` a -> a

    然后您可以通过以下方式定义应用程序运算符
    ($) :: WellPointed c => c a b -> a -> b
    f $ p = unpoint $ f . point p
    WellPointed 的明显例子当然是 哈斯克本身:
    instance WellPointed (->) where
    type Terminal c = ()
    --point :: a -> () -> a
    point a () = a
    --unpoint :: (() -> a) -> a
    unpoint f = f ()

    另一个众所周知的类别, Kleisli , 不是 WellPointed 的实例正如我写的那样(它允许 point ,但不允许 unpoint )。但是有很多类别可以成为一个好的 WellPointed例如,如果它们完全可以在 Haskell 中正确实现。基本上,所有具有特定属性的数学函数类别( LinKGrp{{•}, Top} ...)。这些不能直接表示为 Category 的原因是他们不能有任何 Haskell 类型作为对象;较新的类别库,如 categoriesconstrained-categories允许这样做。例如, I have implemented this :
    instance (MetricScalar s) => WellPointed (Differentiable s) where
    unit = Tagged Origin
    globalElement x = Differentiable $ \Origin -> (x, zeroV, const zeroV)
    const x = Differentiable $ \_ -> (x, zeroV, const zeroV)

    如您所见, the class interface实际上和我上面写的有点不同。在 Haskell 中还没有一种普遍接受的方式来实现这些东西……在 constrained-categories , $运算符实际上更像 Cirdec 描述的那样工作。

    关于haskell - 泛化 ($),如 Control.Category 泛化 (.),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31118949/

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