如何在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) = ...

我记得在某处看到过这种用法,但不记得了。上面的代码警告我添加一些额外的编译指示,例如ConstraintKinds我无法使其工作。

回答

这是唯一缺少的是类型参数maConstraintKinds语言编译[GHC-DOC] :

{-# 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) = …


以上是如何在Haskell中对类型类进行分组的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>