如何在Haskell中将typeclass分组

如何在Haskell中将typeclass分组,haskell,Haskell,目的是使类型类约束代码更干净 type CanThrowDice = (Monad m, MonadIO m, Random a) throwDice :: CanThrowDice m a => (a, a) -> m a throwDice (r1, r2) = ... 而不是写: throwDice :: (Monad m, MonadIO m, Random a) => (a, a) -> m a throwDice (r1, r2) = ... 我记得在

目的是使类型类约束代码更干净

type CanThrowDice = (Monad m, MonadIO m, Random a)

throwDice :: CanThrowDice m a => (a, a) -> m a
throwDice (r1, r2) = ...
而不是写:

throwDice ::  (Monad m, MonadIO m, Random a) => (a, a) -> m a
throwDice (r1, r2) = ...
我记得在某处见过这种用法,但记不起来了。
上面的代码警告我添加一些额外的pragma,例如我无法使其工作的
ConstraintKinds

唯一缺少的是类型参数
m
a
,以及:

{-#语言约束种类}
--&向下箭头&向下;类型参数
类型CanThrowDice m a=(单子m、单子m、随机a)
throwDice::CanThrowDice m a=>(a,a)->m a
throwDice(r1,r2)=……
{-# LANGUAGE ConstraintKinds #-}

--                ↓ ↓ type parameters
type CanThrowDice m a = (Monad m, MonadIO m, Random a)

throwDice :: CanThrowDice m a => (a, a) -> m a
throwDice (r1, r2) = …