gpt4 book ai didi

haskell - kind 类型 (* -> *) -> * 的仿函数和应用程序

转载 作者:行者123 更新时间:2023-12-03 11:59:44 25 4
gpt4 key购买 nike

我遇到了这样一种情况,我的代码可以从使用 Functor 中受益。和 Applicative - 类似抽象,但用于类型 (* -> *) -> * .可以使用 RankNTypes 定义更高种类的仿函数像这样

class HFunctor f where
hfmap :: (forall x. a x -> b x) -> f a -> f b

但是 Applicative 的更高版本有点棘手。这是我能想到的最好的:
class HFunctor f => HApplicative f where
hpure :: (forall x. a x) -> f a
(<**>) :: f (a :-> b) -> f a -> f b

newtype (:->) a b x = HFunc (a x -> b x)

infixr 5 :->

我们需要 :->包装器类型,以便具有 * -> * 类型的函数, 但这并不能让我们像 <$> 那样很好地链接函数应用程序。和 <*>对于正常的应用程序。我可以使用助手进行管理,例如
liftHA2 :: HApplicative f => (forall x. a x -> b x -> c x) -> f a -> f b -> f c
liftHA2 f fa fb = hpure (fun2 f) <**> fa <**> fb where
fun2 = HFunc . (HFunc .)

但是最好有一种通用的方法来“提升”任何数量的功能。

如何使用上述实例的一些简单示例:
data Example f = Example (f Int) (f String)

instance HFunctor Example where
hfmap f (Example i s) = Example (f i) (f s)

instance HApplicative Example where
hpure a = Example a a
Example (HFunc fi) (HFunc fs) <**> Example i s = Example (fi i) (fs s)

e :: Example []
e = Example [1,2,3] ["foo", "bar"]

e' :: Example ((,) Int)
e' = hfmap (length &&& head) e -- Example (3,1) (2, "foo")

e'' :: Example []
e'' = liftHA2 (++) e e -- Example [1,2,3,1,2,3] ["foo", "bar", "foo", "bar"]

所以,我的问题是:上面提到的类型类是什么,它们是否已经由 hackage 中的某个库提供?通过谷歌搜索,我想出了 Functor2 linear-maps HFunctor multi-rec 但两者都不是我需要的。

另外,有没有办法写 HApplicative没有 :->包装器或其他使功能提升更容易的方法?

最佳答案

我倾向于想到的HFunctor是(* -> *) -> * -> * -- 即仿函数上的合法仿函数。这与您所想的具有不同的特征。

以下是如何定义它,以及它上面的应用程序的“monoidal”版本。

type Nat f g = forall a. f a -> g a

class HFunctor (f :: (* -> *) -> * -> *) where
hfmap :: (Nat g h) -> Nat (f g) (f h)

data Prod f g a = Prod (f a) (g a)

class HFunctor f => HApplicative f where
hpure :: Nat g (f g)
htensor :: Nat (Prod (f g) (f h)) (f (Prod g h))

稍后我将尝试更新一些关于这是什么以及如何使用它的想法。

我意识到,这并不完全是您所要求的,但我受到您的帖子的启发而尝试了它。

我也会对您的特定用例感兴趣。

对于你的两个具体问题 A)你描述的 HFunctor 之前已经在各种场合描述过,我认为特别是 Gibbons,但我不知道它是否打包。我之前肯定没见过 Applicative。 B)我认为你被包装器困住了,因为我们不能部分应用类型同义词。

关于haskell - kind 类型 (* -> *) -> * 的仿函数和应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18052158/

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