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

mar*_*ngw 54 syntax haskell typeclass

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

class (Monoid w, Monad m) => MonadWriter w m | m -> w
Run Code Online (Sandbox Code Playgroud)

这增加了什么附加信息给类定义?

C. *_*ann 47

垂直条是一个语法分隔符,本身没有任何意义,用于在多参数类型类上引入函数依赖,因此技术上|没有任何意义.据推测,它|被选择作为相同符号在功能上用于图案防护的视觉类比.

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

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

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


sep*_*p2k 14

它指定了功能依赖.