我无法弄清楚“| m -> w”部分在这样的类定义中意味着什么:
class (Monoid w, Monad m) => MonadWriter w m | m -> w
这会向类定义添加哪些附加信息?
竖线是语法分隔符,本身没有任何意义,用于引入函数依赖在多参数类型类上,所以从技术上讲|
没有任何意义。想必|
被选择作为对相同符号的使用的视觉类比图案卫士关于功能。
至于函数依赖本身,只需阅读x -> y
作为“类型参数x
唯一确定类型参数y
”,意思是知道x
仅凭这一点就足以找到正确的实例。还有更多的复杂情况,特别是在启用其他 GHC 扩展的情况下,但大多数时候您不需要担心它们。
相反,如果没有函数依赖性,选择多参数类型类的实例需要知道所有类型参数。一个典型的例子有一个参数是容器类型,第二个参数是所包含元素的类型;诸如“concatenate”或“isEmpty”之类的函数不需要提及元素类型,只需提及容器类型,因此会产生歧义。
另外,如果您正在编写自己的类型类,请考虑使用类型家族,这是一种最终可能取代函数依赖的新方法。粗略地说,类型族让你可以超载地编写类型定义在实例内部,而不仅仅是重载函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)