Я использовал семейство типов в данных 'D', чтобы ограничить тип первого элемента в нем. Теперь мне нужно создать объект любого типа «D B1» или «D B2» из некоторых общих функций (например, middle_func). Но приведенный ниже код не работает. Любые предложения, как это сделать? или поставить аналогичные ограничения другим способом.Haskell как построить объект, имеющий зависимые типы
data A1 = A1
data A2 = A2
data B1 = B1
data B2 = B2
data C a b where
C1 :: Int → C a b
C2 :: Char → C A1 b
C3 :: Bool → C A1 B1
type family ResT b where
ResT B1 = C A1 B1
ResT B2 = C A2 B2
data D b where
D1 :: ResT B1 → C A1 B1 → D B1
D2 :: ResT b → C A1 b → D b
-- This does not compile
intermediate_func :: Int → D b
intermediate_func i = D2 (C1 i) (C1 i)
-- This works
-- intermediate_func :: Int -> D B2
-- intermediate_func i = D2 (C1 i) (C1 i)
-- So does this
-- intermediate_func :: Int -> D B1
-- intermediate_func i = D2 (C1 i) (C1 i)
спасибо чи! это работает. Но мне бы очень хотелось не поместить это в каждый API. Поэтому использование классов классов было бы намного лучше. Я попытался реализовать один, используя ответ, который вы дали в другом сообщении, но все еще не мог понять, как это сделать :(Можете ли вы опубликовать ответ, используя классы типов тоже? – dfordivam
Я попытался получить что-то вроде этого, чтобы работать 'intermediate_func :: (IsB b) => Int -> D b' – dfordivam
@dfordivam Отредактировано – chi