我目前正在阅读马丁·格拉布米勒的“Monad变形金刚”。
论文中有一个部分,他列出了以下实例声明:
instance (MonadError e m) => MonadError e (ReaderT r m) where...
我已经看遍了,但是我真的找不到像(Foo a b)这样的多参数约束到底意味着什么的信息。我不完全理解e和m是如何在实例=> MonadError e (ReaderT r m)中协同工作的。
这些多参数约束是如何工作的?谢谢!
发布于 2018-11-10 19:06:20
本质上,像Show a这样的约束约束类型变量a来表示可显示的类型。你似乎明白这一点。
表单C a b的约束约束了类型变量a和b的对。直观地说,这一约束意味着这类类型之间存在着某种关系。
考虑一下这个虚构的类
class C a b where
sum :: a -> b -> (Int, b)直观地说,约束C a b意味着a和b可以一起被sum编辑(按这个顺序!),这个和的结果将是一对(Int, b)。
在你的情况下你要面对的是
class Monad m => MonadError e m | m -> e where
throwError :: e -> m a在这里,MonadError e m表达了e和m之间的下列关系。
m是一个单曲e是一种类型,我们可以将任何值x :: e转换为throwError x :: m a,用于任何a。直观地说,这是一种“错误”类型,表示某些错误的性质,而throwError只在monad中包含这样的值。m,只有一种错误类型e。换句话说,这种关系实际上是一个函数。这是通过上述类中的函数依赖项... | m -> e来表示的。简单的版本是:MonadError m a意味着m是一个可以表示某些e类型的“错误值”的monad。
例如,如果我们有可用的MonadError M String,我们可以编写
foo :: Int -> M Int
foo n | n == 0 = throwError "can't handle zero!"
| otherwise = return (100 `div` n)https://stackoverflow.com/questions/53242275
复制相似问题