gpt4 book ai didi

haskell - Haskell 实例上下文中的通用量化?

转载 作者:行者123 更新时间:2023-12-02 03:36:30 24 4
gpt4 key购买 nike

原始问题

我想做以下工作:

class Functor2 c where
fmap2 :: (a->b) -> c x a -> c x b

instance Functor (c x) => Functor2 c where
fmap2 = fmap

但是我得到了错误:

Could not deduce (Functor (c x1)) arising from a use of `fmap'
from the context (Functor (c x))

我该怎么做?


我的用例

我想为我的 Applicative 实例使用 Arrow 方法(和糖等)。更具体地说,我想要:

newtype Wrap f g a b = W   { unwrap  :: ( f (g a b) ) } 

instance (Category g, "Forall x." Applicative (g x), Applicative f) => Arrow (Wrap f g)

这个实例会自动从这些(已经工作的)实例中得到:

instance (Category g, Applicative f) => Category (Wrap f g) where
id = W $ pure id
(W x) . (W y) = W $ liftA2 (.) x y

instance (Applicative (g x), Applicative f) => Functor (Wrap f g x) where
fmap f = W . fmap (fmap f) . unwrap

instance (Applicative (g x), Applicative f) => Applicative (Wrap f g x) where
pure = W . pure . pure
(W ab) <*> (W a) = W $ pure (<*>) <*> ab <*> a

如果我能让这个工作:

instance (Category c, "Forall x." Applicative (c x)) => Arrow c where
arr f = (pure f) <*> id
first a = pure (,) <*> (arr fst >>> a) <*> (arr snd)

arrfirst 的类型在编译器中 check out 。问题是必需的 "Forall x.",我不知道如何在 Haskell 中表述。

g 的一个简单示例是 ->:Category (->)Applicative ((->) x) 用于所有 x

最佳答案

这并没有真正实现您的目标,但也许可以向前迈出一步。你的 forall x。 Functor (c x) 就是这样写的 AllFunctor2 c。主要缺点是您必须为要放入该类的每个仿函数提供一个实例。

{-# LANGUAGE GADTs, ScopedTypeVariables #-}

data Ftor f where
Ftor :: Functor f => Ftor f

class AllFunctor2 c where
allFtor2 :: Ftor (c a)

instance AllFunctor2 (->) where
allFtor2 = Ftor

fmap2 :: AllFunctor2 c => (a->b) -> c x a -> c x b
fmap2 f (x :: c x a) = case allFtor2 :: Ftor (c x) of Ftor -> fmap f x

可能以上与直接向 Functor2 提供实例没有太大区别:

class Functor2 c where
fmap2 :: (a->b) -> c x a -> c x b

instance Functor2 (->) where
fmap2 = fmap

关于haskell - Haskell 实例上下文中的通用量化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23175756/

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