haskell中的SomeException数据类型

时间:2019-02-26 13:47:40

标签: haskell

之间有什么区别?

data SomeException = forall e . Exception e => SomeException e

data SomeException = Exception e => SomeException e

为什么我们需要全部? link to source

2 个答案:

答案 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中详细了解它。