From bc85037bbd57d82da6153a39a1ff0902af5ab0fa Mon Sep 17 00:00:00 2001 From: scarletsky Date: Wed, 20 Jan 2016 16:46:49 +0800 Subject: [PATCH] Amend translation in section Relaxing some restrictions on typeclasses --- chp/6.rst | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/chp/6.rst b/chp/6.rst index 72bcc69..87f37bf 100644 --- a/chp/6.rst +++ b/chp/6.rst @@ -1176,19 +1176,18 @@ Haskell 的有意地设计成允许我们任意创建类型类的实例,每当 放松(relex)类型类的一些限制 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -通常,我们不能写一个类型类实例,(仅)为了一个多态类型(polymorphic type)的特化版本(specialized version)。 -``[Char]`` 类型就是多态类型 ``[a]`` (其中的 ``a``)特化成类型 ``Char`` 。 -我们就这样被禁止声明 ``[Char]`` 为某个类型类的实例。 -这"高度地"(highly)不方便,因为字符串无处不在于实际的代码中。 +通常,我们不能为一个多态类型的特殊版本写一个类型类的实例。 +``[Char]`` 类型就是多态类型 ``[a]`` 的一个特殊版本,因此,声明 ``[Char]`` 为某个类型类的实例是不合法的。 +这非常(highly)不方便,因为字符串在实际代码中是无处不在的。 -``TypeSynonymInstances`` ("同义类型的实例")语言扩展取消了这个限制,并允许我们写这样的实例。 +``TypeSynonymInstances`` (同义类型的实例)语言扩展移除了这个限制,允许我们写这样的实例。 GHC 支持另外一个有用的语言扩展, ``OverlappingInstances`` (覆盖实例)。 它解决(原文为address)了在处理重叠实例时候我们碰到的问题。 -如果存在多个重叠的实例去从中选择,这个扩展会"采摘"(pick)最相关的(specific)那一个。 +如果存在多个重叠的实例去从中选择,这个扩展会选择(pick)最相关的(specific)那一个。 -我们经常使用这个扩展,同 ``TypeSynonymInstances`` 一起。 -这里是一个例子。 +我们经常把 ``OverlappingInstances`` 和 ``TypeSynonymInstances`` 放在一起使用。 +这里有一个例子。 :: @@ -1212,16 +1211,20 @@ GHC 支持另外一个有用的语言扩展, ``OverlappingInstances`` (覆 如果我们应用(apply) ``foo`` 于 ``String`` ,编译器会选择 ``String`` 相关的(specific)实现。 虽然我们有一个 ``Foo`` 的实例关于 ``[a]`` 和 ``Char`` ,但关于 ``String`` 的实例更相关,所以 GHC 选择它。 -即使 ``OverlappingInstances`` (覆盖实例)扩展出于使能状态(enabled),GHC仍将拒绝代码,若他找到一个以上等价地相关的(equally specific)实例。 +在启用 ``OverlappingInstances`` 扩展的情况下,如果 GHC 找到一个以上同样具体(equally specific)的实例,它依然会拒绝代码。 -.. note:: 何时去使用 ``OverlappingInstances`` 扩展? +.. note:: 在哪里使用 ``OverlappingInstances`` 扩展? - 这是一个重要的点:GHC认为 ``OverlappingInstances`` 会影响一个实例的声明,而不是一个位置,于此(位置)我们使用一个实例。 - 换句话说,当我们定义一个实例,其(这个实例)我们希望能(被)允许覆盖(overlap)于其他实例的时候,我们必须使能(enable)该扩展(``OverlappingInstances``)为这个模块,而其(这个模块)包含着定义。 - 当他编译这个模块的时候,GHC会记录那个实例为"能被覆盖(overlap)以其他的模块"的。 - 一旦我们引入(import)这个模块而使用他的实例,我们将不需要使能(enable) ``OverlappingInstances`` 编译选项在引入模块的时候:GHC将已经知道这个实例是被标记为"对覆盖友好的"(okay to overlap),当他被定义的时候。 - 这种行为是很有用的,当我们在写一个库(library)的时候:我们能选择去创造可覆盖的(overlappable)实例,但是库的用户不必须使能(enable)任何特殊的语言扩展。 + 这是一个重要的点:GHC 把 ``OverlappingInstances`` 当作在声明实例时有效,并非我们使用实例的地方。 + 换句话说,当我们定义一个可以覆盖其他实例的实例时,我们必须在其定义的模块中启用这个扩展。 + 当 GHC 编译该模块的时候,它就会记录那个实例是「能被其他实例覆盖的实例」。 + 一旦我们导入这个模块并使用它的实例,我们就不需要在导入的模块中启用 ``OverlappingInstances`` 扩展了, + 因为 GHC 已经知道那个实例在被定义的时候已经是被标记成「可以覆盖(okay to overlap)」的了。 + + 这个行为在我们写库的时候是非常有用的,因为我们可以选择去创造可以覆盖的实例,而库的用户并不需要启用任何特殊的语言扩展。 + + [scarletsky译注:原本中的标题为 When to use the OverlappingInstances extension ,但实际上把 When 改为 Where 更适合 ] .. _how-does-show-work-for-strings: