加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Haskell中的功能依赖

发布时间:2020-12-14 05:05:24 所属栏目:百科 来源:网络整理
导读:我试图围绕功能依赖关闭我的头脑,但是我没有得到我自己的任何地方.在文章“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 acl
我试图围绕功能依赖关闭我的头脑,但是我没有得到我自己的任何地方.在文章“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’的返回类型是唯一的,因此可以推断.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读