Haskell中的功能依赖

我试图围绕功能依赖关闭我的头脑,但是我没有得到我自己的任何地方.在文章“Monad Transformers Step by Step”中,作者给出了这两个类型定义:

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

从我对我在网上找到的一些材料的理解,这意味着类型变量e由m决定.我只是不明白这是什么意思.怎么确定任何人都可以用最少的理论轻描淡写,然后再链接更重的理论材料?

谢谢

解决方法

当您有多参数类型类时,认情况下,类型变量是独立考虑的.所以当类型参与者试图找出哪个实例时

class Foo a b

要选择,它必须独立地确定a和b,然后去查看检查实例是否存在.通过功能依赖,我们可以减少这个搜索.当我们做某事时

class Foo a b | a -> b

我们说“看,如果你确定一个是什么,那么有一个独特的b,所以Foo a b存在,所以不要打扰推测b,只是去查找实例和类型检查”.这让我们更加有效的类型参与者,并帮助推荐在许多地方.

这对返回类型多态性尤其有帮助

class Foo a b c where
  bar :: a -> b -> c

现在没有办法推断

bar (bar "foo" 'c') 1

因为我们无法确定c.即使我们只写了一个String和Char的实例,我们必须假设有人可能会/会来,然后再添加一个实例.没有底线,我们必须实际指定返回类型,这是令人讨厌的.但是我们可以写

class Foo a b c | a b -> c where
  bar :: a -> b -> c

现在很容易看出,“foo”’c’的返回类型是唯一的,因此可以推断.

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...