Автоматически получить Unbox для нового типа без TH

Итак, у меня есть довольно простой новый тип:

newtype SomeID = SomeID Word64 deriving (Show,Eq)

И я хотел бы использовать этот тип в распакованном векторе, но при первом осмотре это кажется более сложным, чем вывод... скажем... Storable, И когда я говорю "деривация", я в идеале надеюсь на автоматическую деривацию через GeneralizedNewtypeDeriving Когда я смотрю на вывод типов по умолчанию vector библиотека, я вижу это.

Кроме того, при поиске в Интернете я наткнулся на этот пост, который предлагал использовать Template Haskell решить проблему. В настоящее время я не использую TH, и было бы неплохо, чтобы меня не заставляли идти по этому пути.

Все, что я пытаюсь сделать здесь, - это иметь в противном случае не распаковываемый тип данных, который оказывается семантически ортогональным этому исходному типу, потому что я хочу использовать умный конструктор в своем API. Есть ли способ сделать этот тип без коробки без обращения к Template Haskell или тонна котельной плиты? Это похоже на то, что может быть получено в общем newtype будет просто удален во время компиляции. В идеале я хотел бы просто сделать это:

{-# LANGUAGE DeriveAnyClass #-}

import qualified Data.Vector.Generic.Mutable as M
import qualified Data.Vector.Generic as G
import Data.Vector.Unboxed
import Data.Word

newtype SomeID = SomeID Word64 deriving (Show,Eq,Unbox,M.MVector MVector,G.Vector Vector)

Прямо сейчас, когда я пытаюсь автоматически получить, используя метод выше, я получаю эту ошибку:

Var/Type length mismatch: 
  [a_a3zv]
  []
Var/Type length mismatch: 
  [a_a3zv]
  []
Var/Type length mismatch: 
  [a_a3zS]
  []
Var/Type length mismatch: 
  [a_a3zS]
  []

/home/oldmanmike/so-question/Main.hs:14:50:
    No instance for (G.Vector Vector SomeID)
      arising from the 'deriving' clause of a data type declaration
    Possible fix:
      use a standalone 'deriving instance' declaration,
        so you can specify the instance context yourself
    When deriving the instance for (Unbox SomeID)

/home/oldmanmike/so-question/Main.hs:14:56:
    No instance for (M.MVector Word64)
      arising from the first field of ‘SomeID’ (type ‘Word64’)
    Possible fix:
      use a standalone 'deriving instance' declaration,
        so you can specify the instance context yourself
    When deriving the instance for (M.MVector SomeID)

/home/oldmanmike/so-question/Main.hs:14:75:
    No instance for (G.Vector Word64)
      arising from the first field of ‘SomeID’ (type ‘Word64’)
    Possible fix:
      use a standalone 'deriving instance' declaration,
        so you can specify the instance context yourself
    When deriving the instance for (G.Vector SomeID)

Если я использую GeneralizedNewtypeDeriving вместо DeriveAnyClass Я получаю гораздо более длинное сообщение об ошибке о ролях семейства типов, которое, как я полагаю, исторически было проблемой с реализацией этой техники. Что-нибудь изменилось?

0 ответов

Другие вопросы по тегам