Haskell类型类可以部分实现吗?

问题描述 投票:1回答:1

我想制作一个成对的类型来表示模块化算术。我做了它的构造函数

{- 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 ba,此数据类型都没有有意义的b概念,但是只要ab确实可以构造Zn ]个实例(即Integer)。我也尝试过使用Zn构造函数,并且所有方法都需要Integral e,但是我遇到了类似的问题。在那种情况下,s的类型为a,因此用它和Zn构造f n :: b会失败。在第二种情况下,我可以将sa转换为Integer,然后转换为b,但这很笨拙。整个过程有点笨拙。我之所以这样做,是因为我希望能够在映射函数后实现FunctorApplicative以执行mod,因此我可以将+实现为liftA2 (+),依此类推。据我所知,模数s应该是该类型的一部分,但是依存类型在Haskell中并不实际。

是否有可能仅对某些参数将类型为* -> *的类型实现为Functor

我想制作一个成对的类型来表示模块化算术。我将其构造函数设为{-语言GADT-}数据Zn e,其中Zn :: Integer-> Integer-> Zn Integer因为我想成为...

haskell types functor applicative
1个回答
3
投票

您正在寻找MonoFunctor。就像MonoFunctor一样,但是使用固定的内部类型而不是参数多态的。这是为您的类型实现它的方法:

© www.soinside.com 2019 - 2024. All rights reserved.