10

我正在尝试在一个也从加速库导入的模块中show输入某种类型的东西Tagged s bData.Tagged )。不幸的是,加速库定义了显示实例

instance Kit acc => Show (acc aenv a) where

在 Data.Array.Accelerate.Pretty.hs 中。阅读了一下,我无法避免导入这个实例,它显然与 Data.TaggedShow实例重叠。事实上,通用加速实例阻止我打印任何类型的东西*->*->*

这是一个演示问题的简单示例:

{-# LANGUAGE FlexibleContexts, OverlappingInstances, IncoherentInstances #-}

import Data.Array.Accelerate
import Data.Tagged

main :: (Show (Tagged Int Int)) => IO ()
main = let x = Tagged 3
   in print (x::Tagged Int Int)

错误:

    Overlapping instances for Show (Tagged * Int Int)
      arising from a use of `print'
    Matching instances:
      instance Show b => Show (Tagged k s b) -- Defined in `Data.Tagged'
      instance [overlap ok] accelerate-0.13.0.5:Data.Array.Accelerate.Trafo.Base.Kit
                          acc =>
                        Show (acc aenv a)
    -- Defined in `Data.Array.Accelerate.Pretty'

我有几个问题:

  1. 我以为OverlappingInstances可以让我解决实例,但我得到了同样的错误。
  2. IncoherentInstances绝对应该让我编译...对吗?但事实并非如此。
  3. 为什么 GHC 将 Data.Tagged 显示实例报告为Show (Tagged k s b) 实例(从 Data.Tagged 复制)为:

    instance Show b => Show (Tagged s b) where
    

我相信我以前见过我只能通过添加显式类型签名来解决重叠实例(以强制 GHC 选择最具体的实例),但由于我的示例处于顶层并且不涉及多态性,所以我没有不知道我对这些类型能说得清楚多少。

我的印象是 GHC 应该能够选择 Data.Tagged 实例,因为(我认为)Tagged不是实例,Accelerate.Base.Kit因此不符合实例约束(我知道我们只匹配实例的 RHS,但 GHC 应该能够找出其中一个实例不可能适用...)

编辑

我在这里创建了一个错误报告,现在在 repo 头中删除了有问题的实例。下面的#3 有一个很好的答案,但我仍然想知道为什么OverlappingInstances/IncoherentInstances不起作用。

4

1 回答 1

5

我只知道3的答案。

当一个类型被编译-XPolyKinds并且对类型变量的类型没有限制时,GHC 会非常糟糕地打印该类型。在类型名称之后,它打印所有多态类型变量的种类列表,然后是类型变量。所以k类型签名中的出现意味着类型变量s可以是任何类型的。(由于它的使用方式,b必须有 kind *,所以它不是 kind-polymorphic,所以它的 kind 没有列出。)

作为一个多么荒谬的例子,这是我现在正在研究的图书馆的黑线鳕文档中的一个例子。

(SingI Nat a, SingI Nat b, SingI Nat c, SingI Nat d, SingI Nat e) => StaticSize ((,,,,) Nat Nat Nat Nat Nat) ((,,,,) Nat Nat Nat Nat Nat a b c d e)

它也使用了提升的 5 元组。这只是让它变得非常愚蠢,因为这意味着元组同时出现在种类和类型中。

于 2013-08-06T05:29:06.023 回答