gpt4 book ai didi

haskell - 可以为这种类型创建应用实例吗?

转载 作者:行者123 更新时间:2023-12-05 05:38:25 25 4
gpt4 key购买 nike

作为对方差如何工作的探索,我想出了这种类型,它可以是 FunctorContravariant,具体取决于它的参数:

newtype Shift f g a = Shift { runShift :: f a -> g a }

它类似于 Endo,除了使用额外的类型变量来使类型的变化不明确。

如果f是协变的而g是逆变的,那么Shift f g是逆变的:

instance (Functor f, Contravariant g) => Contravariant (Shift f g) where
contramap f (Shift g) = Shift (contramap f . g . fmap f)

如果 f 是逆变的并且 g 是协变的,那么 Shift f g 是协变的:

instance (Contravariant f, Functor g) => Functor (Shift f g) where
fmap f (Shift g) = Shift (fmap f . g . contramap f)

据我了解,Divisible(来自 contravariant 包中的 Data.Functor.Contravariant.Divisible)是 Contravariant 因为 ApplicativeFunctor。使用它,Shift 也可以扩展为 Divisible 的实例:

instance (Functor f, Divisible g) => Divisible (Shift f g) where
conquer = Shift (const conquer)
divide f (Shift g) (Shift h) = Shift $
\x -> case unzipF (fmap f x) of
(b,c) -> divide f (g b) (h c)
unzipF :: Functor f => f (a,b) -> (f a,f b)
unzipF x = (fmap fst x, fmap snd x)

因为 Divisible (Shift f g) 上的约束是 (Functor f, Divisible g),我希望它相应地“翻转”一个 Applicative 实例,例如

instance (Contravariant f, Applicative g) => Applicative (Shift f g) where { ... }

但是,我不知道如何填写详细信息。我未完成的实现需要这样的功能:

unzipC :: Contravariant f => f (a,b) -> (f a,f b)

但我想不出不使用 fmap 的解决方案。

这里是完整的实现:

instance (Contravariant f, Applicative g) => Applicative (Shift f g) where
pure x = Shift (const (pure x))
liftA2 f (Shift g) (Shift h) = Shift $
\x -> case unzipC (contramap (uncurry f) x) of
(a,b) -> liftA2 f (g a) (h b)

那么,这样的 unzipC 真的存在吗?如果不是,是否仍然可以挽救 Applicative (Shift f g) 实例?

最佳答案

不,这样的(全部)功能不可能存在。请注意,它允许您构造 Void 类型的值:

import Data.Functor.Contravariant
import Data.Void

unzipC :: Contravariant f => f (a,b) -> (f a,f b)
unzipC = undefined

uhoh :: Void
uhoh = getOp (fst $ unzipC $ Op snd) ()

解释:类型((), Void) -> Voidsnd 居住。 unzipC 会让你从 ((), Void) 中得到一个 () -> Void 和一个 Void -> Void -> Void,但 () -> Void 显然无人居住。

我不确定是否还有其他方法可以编写您想要的实例。当/如果我弄明白了,我会编辑这个答案。

关于haskell - 可以为这种类型创建应用实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72918092/

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