我试图围绕功能依赖关闭我的头脑,但是我没有得到我自己的任何地方.在文章“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’的返回类型是唯一的,因此可以推断.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。