【发布时间】:2017-04-19 15:18:30
【问题描述】:
这在 ghc 7.8.4 中运行良好,但在 7.10.3 中失败:
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Foo where
import qualified Data.Array.Unboxed as A
import GHC.Generics (Generic)
newtype Elt = Elt Int deriving (Eq, Ord, Show, Num, Integral, Real, Enum, A.IArray A.UArray, Generic)
type MyArr = A.UArray Int Elt
有很多类似的消息
/tmp/my.hs:9:75:
Couldn't match type ‘Int’ with ‘Elt’
arising from the coercion of the method ‘Data.Array.Base.numElements’
from type ‘forall i. A.Ix i => A.UArray i Int -> Int’
to type ‘forall i. A.Ix i => A.UArray i Elt -> Int’
Relevant role signatures:
type role A.Ix nominal
type role A.UArray nominal nominal
When deriving the instance for (A.IArray A.UArray Elt)
虽然 7.10 的发行说明没有提及,但我明白了 https://ghc.haskell.org/trac/ghc/ticket/9220#comment:11 承认这是一个重大变化。但是解决方案是什么——我真的必须为 MyArr 创建一个新类型的包装器,并为每次使用提供帮助函数吗?
【问题讨论】:
-
有趣。也许
UArray从元素的代表角色转变为名义角色?我想知道为什么。 -
是的,看起来你会的(
vector的另一个论点 - 获取UnBox实例要容易得多)。即使您想通过IArray UArray Elt实例来unsafeCoerce,您也不能这样做,因为您需要实现的方法不会被导出。虽然我理解为什么我们不应该在这里接地,但我们不能手写IArray的实例这一事实让我有点不高兴...... -
您可以从
Data.Array.Base导入方法。 -
@ReidBarton 哦。出于某种原因,我认为这没有暴露。谢谢!
-
@ReidBarton,我认为必要的
Coercions 应该从GHC.Arr和Data.Array.Unsafe或诸如此类导出。这不会给我们 GND,但会让我们coerce方法。