首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >haskell中的多参数上下文约束

haskell中的多参数上下文约束
EN

Stack Overflow用户
提问于 2018-11-10 18:46:27
回答 1查看 110关注 0票数 1

我目前正在阅读马丁·格拉布米勒的“Monad变形金刚”。

论文中有一个部分,他列出了以下实例声明:

instance (MonadError e m) => MonadError e (ReaderT r m) where...

我已经看遍了,但是我真的找不到像(Foo a b)这样的多参数约束到底意味着什么的信息。我不完全理解em是如何在实例=> MonadError e (ReaderT r m)中协同工作的。

这些多参数约束是如何工作的?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-10 19:06:20

本质上,像Show a这样的约束约束类型变量a来表示可显示的类型。你似乎明白这一点。

表单C a b的约束约束了类型变量ab的对。直观地说,这一约束意味着这类类型之间存在着某种关系。

考虑一下这个虚构的类

代码语言:javascript
复制
class C a b where
   sum :: a -> b -> (Int, b)

直观地说,约束C a b意味着ab可以一起被sum编辑(按这个顺序!),这个和的结果将是一对(Int, b)

在你的情况下你要面对的是

代码语言:javascript
复制
class Monad m => MonadError e m | m -> e where
   throwError :: e -> m a

在这里,MonadError e m表达了em之间的下列关系。

  1. m是一个单曲
  2. e是一种类型,我们可以将任何值x :: e转换为throwError x :: m a,用于任何a。直观地说,这是一种“错误”类型,表示某些错误的性质,而throwError只在monad中包含这样的值。
  3. 给定m,只有一种错误类型e。换句话说,这种关系实际上是一个函数。这是通过上述类中的函数依赖项... | m -> e来表示的。

简单的版本是:MonadError m a意味着m是一个可以表示某些e类型的“错误值”的monad。

例如,如果我们有可用的MonadError M String,我们可以编写

代码语言:javascript
复制
foo :: Int -> M Int
foo n | n == 0    = throwError "can't handle zero!"
      | otherwise = return (100 `div` n)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53242275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档