gpt4 book ai didi

haskell - 试图将包装类型族变成类似 Functor 的东西

转载 作者:行者123 更新时间:2023-12-03 14:58:28 26 4
gpt4 key购买 nike

下面是一个简单的例子,其中恒等函数运行良好:

newtype R a = R a

instance Functor R where
fmap f (R a) = R $ f a

但是如果我添加一个中间类型系列,事情就会变得不稳定:
data IntT
data a :-> b

type family Sem a :: *
type instance Sem IntT = Int
type instance Sem (a :-> b) = Sem a -> Sem b

newtype S a = S (Sem a)

现在我不能把 S 变成一个仿函数。我可以很容易地定义一个新的类 Functor 类的东西,但是我还需要一类 Applicative-like 和 Monad-like,这似乎是一条不愉快的道路。特别是作为
smap f (S a) = S $ f a

居然有我想要的类型,即 smap :: (Sem a -> Sem b) -> S a -> S b .但是,当然,这不是 Functor 的类型。 (当“相同”的代码有两种不同的、不兼容的类型时,你不讨厌它吗?)

我探索了 Data.Category.Functor以及 Generics.Pointless.Functors ,但似乎也没有完全解决我的问题。 PointlessTypeFamilies似乎有更多的好主意,但我仍然不确定如何从中获得足够类似 Functor 的东西。

我突然意识到,即使 smap 的代码与 fmap 相同对于 R , 发生的事情略有不同。在某种程度上,如果我从 Sem 进行自然转变至 S ,那么我应该能够以某种方式解除它以获得 smap .那时我想我不妨在这里问一下,这样可能会为我省去不少麻烦!

最佳答案

当我遇到这样的情况时,我通常会切换到类似的东西:

data S b = forall a. S (a -> b) (Sem a)

可以轻松做成中规中矩的 Functor
instance Functor S where
fmap f (S g s) = S (f . g) s

或者我转向 Coyoneda 为我打包这种行为。

关于haskell - 试图将包装类型族变成类似 Functor 的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13372265/

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