我想制作一个成对的类型来表示模块化算术。我做了它的构造函数
{- LANGUAGE GADTs -}
data Zn e where
Zn :: Integer -> Integer -> Zn Integer
因为我希望能够fmap
覆盖所有内容。因此,如果我尝试使其成为Functor
实例
instance Functor Zn where
fmap f (Zn s n) = Zn s $ mod (f n) s
我得到Could not deduce: b ~ Integer from the context: a ~ Integer
。当然,它不能推断出这一点,因为对于所有fmap :: (a -> b) -> Zn a -> Zn b
和a
,此数据类型都没有有意义的b
概念,但是只要a
和b
确实可以构造Zn
]个实例(即Integer
)。我也尝试过使用Zn
构造函数,并且所有方法都需要Integral e
,但是我遇到了类似的问题。在那种情况下,s
的类型为a
,因此用它和Zn
构造f n :: b
会失败。在第二种情况下,我可以将s
从a
转换为Integer
,然后转换为b
,但这很笨拙。整个过程有点笨拙。我之所以这样做,是因为我希望能够在映射函数后实现Functor
和Applicative
以执行mod
,因此我可以将+
实现为liftA2 (+)
,依此类推。据我所知,模数s
应该是该类型的一部分,但是依存类型在Haskell中并不实际。
是否有可能仅对某些参数将类型为* -> *
的类型实现为Functor
?
我想制作一个成对的类型来表示模块化算术。我将其构造函数设为{-语言GADT-}数据Zn e,其中Zn :: Integer-> Integer-> Zn Integer因为我想成为...
您正在寻找MonoFunctor
。就像MonoFunctor
一样,但是使用固定的内部类型而不是参数多态的。这是为您的类型实现它的方法: