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’的返回类型是唯一的,因此可以推断. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |