Haskell类定义中的“|”是什么?

我无法弄清楚这样的类定义中的“| m – > w”

class (Monoid w, Monad m) => MonadWriter wm | m -> w 

这些添加到类定义中的附加信息是什么?

垂直条是一个本身没有意义的语法分隔符,用于在多参数types类中引入函数依赖关系 ,所以在技术上| 没有任何意义。 据推测| 被选为一个视觉的比喻,以相同的符号用于模式守卫function。

就function依赖本身而言,只要将x -> y读为“types参数x唯一确定types参数y ”,这意味着知道x就足以find正确的实例。 还有更多的复杂性,尤其是在启用其他GHC扩展的情况下,但大多数时候您不必担心它们。

相反,没有函数依赖关系,select一个多参数types类的实例需要知道所有的types参数。 一个典型的例子有一个参数是容器types,第二个参数是被包含的元素的types; 诸如“concatenate”或“isEmpty”之类的函数不需要提及元素types,只需要提及容器types,因此是不明确的。

另外,如果你正在编写自己的types类,可以考虑使用types族 ,这是一种可能最终取代函数依赖的新方法。 粗略地说,types族允许你在实例中写入重载的types定义 ,而不仅仅是重载的函数。

它指定了一个函数依赖 。