Это работало отлично в GHC 7.8.4, но терпит неудачу в 7.10.3:Использование NewType в Data.Array.Unboxed с GHC 7.10
{-# 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 допускает его нарушение. Но каково решение - действительно ли мне нужно создать оболочку newtype для MyArr с вспомогательными функциями для каждого использования?
Интересно. Может быть, 'UArray' перешел от представительской к номинальной роли для элемента? Интересно, почему. – chi
Да, похоже, что вы будете (другой аргумент для 'vector' - получение' UnBox' экземпляров намного проще). Даже если вы хотите 'unsafeCoerce' свой путь через экземпляр« IArray UArray Elt », вы не можете, так как методы, которые вам нужно реализовать, не экспортируются. Хотя я понимаю, почему мы не должны здесь GND, тот факт, что мы не можем отписать наш экземпляр 'IArray', делает меня немного недовольным ... – Alec
Вы можете импортировать методы из' Data.Array.Base'. –