2013-03-04 58 views
2

我在阅读Monad Transformers Step by Step。第6页,同时引入的Monad一些子类,笔者给出了下面的代码示例:Haskell:|在类别声明中

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

这是一个功能依赖。这是GHC提供的扩展。你可以阅读更多关于他们here,但他们传达的基本想法是其中一种类型“确定”另一种类型。他们最近已经失宠,因为类型家庭可以传达相同的信息和更多,但更容易理解,功能更强的方式。

编辑:一个例子,取自a question I asked about this topic a year ago

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' 这说'一个决定b'被改变成一个类型族,'a'是类型变量和类型'b'列在类型类中。

+0

同样是声明式的,但功能更强大的方式,当然? – 2013-03-04 21:24:23

+0

也许我的意思是更明确。 – 2013-03-04 21:34:51

+0

你能举一个例子说明如何使用类型族来表达函数依赖的概念吗?另外,对于后代,这里是[Haskell wiki类型家族页面]的链接(http://www.haskell.org/haskellwiki/GHC/Type_families)。 – 2013-03-04 21:43:28