之间有什么区别?
data SomeException = forall e . Exception e => SomeException e
data SomeException = Exception e => SomeException e
为什么我们需要全部? link to source
答案 0 :(得分:3)
第一个称为Existential type。第二个甚至不会编译。
基本上,如果您希望某些变量仅出现在右侧(=的右侧),则必须添加forall
它允许您例如创建异类列表,例如[SomeException]
可以包含SomeException e
的列表,其中e
对于每个元素都是不同的。
答案 1 :(得分:2)
第二个变体甚至无法编译。您会得到:
error: Not in scope: type variable e
原因是不清楚您指的是哪个e
。您可以在左侧添加e
作为类型参数:
data SomeException e = Exception e => SomeException e
但是,这首先失去了SomeException
的意义,即隐藏了涉及具体异常的细节。现在,任何以SomeException e
作为输入的函数都必须再次知道e
的类型。
forall e.
允许我们指定我们真的不在乎SomeException
内的数据对象是什么,只要它是Exception
的实例即可。这也意味着除了类型类SomeException
中包含的内容之外,我们无法对任何Exception
项目执行任何操作。
您可以在Wikibook中详细了解它。