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

时间:2010-04-20 13:57:43

标签: haskell syntax typeclass

我无法弄清楚“| m - > w”-part在类定义中意味着什么:

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

这会为类定义添加哪些附加信息?

2 个答案:

答案 0 :(得分:45)

竖线是一个没有任何意义的句法分隔符,用于多参数类型类的introduce functional dependencies,因此技术上|意味着什么。据推测,|被视为同一符号在函数上pattern guards使用的视觉类比。

就功能依赖性本身而言,只需阅读x -> y作为“类型参数x唯一确定类型参数y”,这意味着仅知道x就足够了找到正确的实例。还有其他复杂情况,特别是启用了其他GHC扩展,但大多数时候您不需要担心它们。

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

此外,如果您正在编写自己的类型类,请考虑使用type families,这是一种可能最终取代功能依赖关系的新方法。粗略地说,类型族允许您在实例中编写重载的类型定义,而不仅仅是重载函数。

答案 1 :(得分:14)

它指定functional dependency