目的是使类型类约束代码更清晰。
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
我无法使其工作。
这是唯一缺少的是类型参数m
和a
与ConstraintKinds
语言编译[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) = …
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句