Skip to content

Commit

Permalink
Amend translation in section Relaxing some restrictions on typeclasses
Browse files Browse the repository at this point in the history
  • Loading branch information
scarletsky committed Jan 20, 2016
1 parent af1117d commit bc85037
Showing 1 changed file with 18 additions and 15 deletions.
33 changes: 18 additions & 15 deletions chp/6.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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`` 放在一起使用
这里有一个例子

::

Expand All @@ -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:

Expand Down

0 comments on commit bc85037

Please sign in to comment.