相关疑难解决方法(0)

Haskell Constraint不小于实例头

有些戒指可以配备标准功能:

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,一切都会变成地狱.

有办法做我想要的吗?

haskell

31
推荐指数
2
解决办法
4091
查看次数

为什么不能为MaybeT派生Show实例?

如果我定义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

6
推荐指数
2
解决办法
147
查看次数

标签 统计

haskell ×2