Автоматически получить 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
Я получаю гораздо более длинное сообщение об ошибке о ролях семейства типов, которое, как я полагаю, исторически было проблемой с реализацией этой техники. Что-нибудь изменилось?