У меня есть этот код:
type family Id obj :: *
type instance Id Box = Int
И я хочу сделать так, чтобы я всегда мог получить Int из семейства типов Id.Я понимаю, что потребуется преобразование.
Я подумал, что, возможно, создание класса сработает:
class IdToInt a where
idToInt :: Id a -> Int
instance IdToInt Box where
idToInt s = s
И это на самом деле компилируется.Но когда я пытаюсь использовать его:
testFunc :: Id a -> Int
testFunc x = idToInt x
я получаю ошибку:
src/Snowfall/Spatial.hs:29:22:
Couldn't match type `Id a0' with `Id a'
NB: `Id' is a type function, and may not be injective
In the first argument of `idToInt', namely `x'
In the expression: idToInt x
In an equation for `testFunc': testFunc x = idToInt x
Итак, как мне создать преобразование для идентификатора семейства типов, чтобы получить Int?
Основываясь на ответе ehird, я попробовал следующее, но оно тоже не работает:
class IdStuff a where
type Id a :: *
idToInt :: Id a -> Int
instance IdStuff Box where
type Id Box = Int
idToInt s = s
testFunc :: (IdStuff a) => Id a -> Int
testFunc x = idToInt x
Выдает ошибку:
src/Snowfall/Spatial.hs:45:22:
Could not deduce (Id a0 ~ Id a)
from the context (IdStuff a)
bound by the type signature for
testFunc :: IdStuff a => Id a -> Int
at src/Snowfall/Spatial.hs:45:1-22
NB: `Id' is a type function, and may not be injective
In the first argument of `idToInt', namely `x'
In the expression: idToInt x
In an equation for `testFunc': testFunc x = idToInt x