有些戒指可以配备标准功能:
class (Ring.C a) => EuclideanDomain a where
norm :: a -> Integer
Run Code Online (Sandbox Code Playgroud)
使用此功能,可以以明显的方式订购戒指:
compare x y = compare (norm x) (norm y)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何表明这一点.我试着这样做
instance (EuclideanDomain a, Eq a) => Ord a where
Run Code Online (Sandbox Code Playgroud)
但这给了我一些警告,当我启用相关的编译器标志时,它告诉我"约束不小于实例头" - 如果我启用UndecidableInstances,一切都会变成地狱.
有办法做我想要的吗?
如果我定义monad变换器类型Identity,它就能够派生Show实例.
newtype IdentityT f a =
IdentityT { runIdentityT :: f a }
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
将衍生出来
instance Show (f a) => Show (IdentityT f a)
Run Code Online (Sandbox Code Playgroud)
但是,如果我定义monad变压器类型 Maybe
newtype MaybeT m a =
MaybeT { runMaybeT :: m (Maybe a) }
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
我收到了错误
• No instance for (Show (m (Maybe a)))
arising from the first field of ‘MaybeT’ (type ‘m (Maybe a)’)
Run Code Online (Sandbox Code Playgroud)
既然Maybe a有一个Show实例,我希望它可以工作和派生
instance Show (m (Maybe a)) => Show (MaybeT …Run Code Online (Sandbox Code Playgroud) haskell ×2