2

我正在逐步阅读 Monad Transformers。在第 6 页,Monad作者在介绍 的一些子类的同时,给出了以下代码示例:

class (Monad m) => MonadError e m | m -> e where
    throwError :: e -> m a
    catchError :: m a -> (e -> m a) -> m a

class (Monad m) => MonadReader r m | m -> r where
    ask :: m r
    local :: (r -> r) -> m a -> m a

部分是什么| m -> e意思?

4

1 回答 1

4

这是一个功能依赖。它是 GHC 中可用的扩展。您可以在此处阅读有关它们的更多信息,但它们传达的基本思想是其中一种类型“确定”另一种类型。它们最近失宠了,因为字体家族可以传达相同的信息甚至更多信息,但以更容易理解、更实用的方式。

编辑:一个例子,取自我一年前就这个话题提出的问题

我从使用功能依赖项的代码开始:

class Shuffle a b | a -> b where
  indices    :: a -> Array Int b
  reorganize :: a -> Array Int b -> a

@ehird 对此解决方案做出了回应:

class Shuffle a where
  type Elt a
  indices    :: a -> Array Int (Elt a)
  reorganize :: a -> Array Int (Elt a) -> a

所以发生的事情本质上是箭头“a -> b”表示“a 确定 b”被更改为类型族,其中“a”是类型变量,类型“b”列在类型类中。

于 2013-03-04T21:22:55.963 回答