gpt4 book ai didi

haskell - 仿函数是 for (a -> b) -> (f a -> f b),什么是 for (Category c) => c a b -> c (f a) (f b)?

转载 作者:行者123 更新时间:2023-12-02 08:57:36 26 4
gpt4 key购买 nike

我想要一个函数,用于将纯函数映射到容器或通过它对应用/单子(monad)操作进行排序。对于纯映射,我们有

fmap :: Functor f => (a -> b) -> (f a -> f b)

对于单子(monad)测序,我们有(来自 Data.Taversable)

mapM :: (Traversable f, Monad m) => (a -> m b) -> (f a -> m (f b))

类似于

mapKleisli :: (Traversable f, Monad m) => Kleisli m a b -> Kleisli m (f a) (f b)
mapKleisli = Kleisli . mapM . runKleisli

我们知道 (->) 和 (Kleisli m) 都是类别(和箭头)。所以很自然地做一个概括:

mapCategory :: (X f, Category c) => c a b -> c (f a) (f b)

你知道这样一个具有类似方法的类X吗?也许,在黑客攻击的某个地方?我尝试 hoogle/hayoo 但没有找到合适的东西。

更新:

现在我更清楚自己需要什么了。 Kleisli 箭头和 (->) 都是 ArrowApply 的实例,它与 Monad 一样强大。我想出了这个基于箭头的 Travesable 版本:

{-# LANGUAGE TypeOperators #-}

import Prelude hiding (id, (.), mapM)
import Control.Arrow
import Control.Category

class Traversable f where
traverse :: ArrowApply (~>) => f a -> (a ~> b) ~> f b

mapArrow :: (ArrowApply (~>), Traversable f) => a ~> b -> f a ~> f b
mapArrow a = arr (\x -> (traverse x, a)) >>> app

instance Traversable Maybe where
traverse Nothing = arr (const Nothing)
traverse (Just x) = arr (\a -> (a, x)) >>> app >>> arr Just

instance Traversable [] where
traverse [] = arr (const [])
traverse (x : xs) = undefined -- this is hard!

我可以使用通常的基于应用程序的 Traversable,并使用 Identity 来实现纯函数,但我不确定它是否好。将纯函数视为一元操作的特例是很奇怪的。将纯函数和一元操作解释为某个操作类(Category/Arrow/ArrowApply)的实例对我来说看起来更简单。

问题:您想完成 [] 的实例吗?我对 ArrowApply 与 Monad 的看法有任何意义吗?

最佳答案

您要求“某个 X 类”,但应该很清楚,该类最(或者可能是唯一)正确的名称是“Functor”。您想要的只是为任意 Category 实例定义的仿函数类,而不是仅限于 (->)

当然,您的定义仍然限于从类别到由提供实例的类型构造函数定义的子类别的(内)仿函数。如果您进一步概括一下,这两个类别没有理由相同,即 a type class something like this one :

class (Category r, Category t) => Functor f r t | f r -> t, f t -> r where
fmap :: r a b -> t (f a) (f b)

与范畴论中仿函数的完整概念相比,这仍然非常有限,但是哦,好吧。

有趣的是,它仍然有一个 (->) 类型构造函数 - 这是因为,即使我们使用任意实例对源类别和目标类别进行建模,整个事物(特别是仿函数本身)在某种意义上仍然存在于 Hask 中,即与 (->) 关联的类别。仿函数的另一半(映射对象的部分)粗略地说,是类型构造函数 * -> * 类型中的 (->) f.

关于haskell - 仿函数是 for (a -> b) -> (f a -> f b),什么是 for (Category c) => c a b -> c (f a) (f b)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6445501/

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