У меня проблемы с определением экземпляров Show для разнородного списка, определенного ниже:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeInType #-}
{-# LANGUAGE FlexibleInstances #-}
import Data.Kind
data HList xs where
HNil :: HList TNil
(::^) :: a -> HList as -> HList (a :^ as)
data TypeList = TNil | (:^) Type TypeList
instance Show (HList TNil) where
show HNil = "[]"
Я хотел бы дать HList xs экземпляр show, если все типы в Typelist xs имеют экземпляр Show. Я думаю, что можно написать что-то вроде
instance (Show a, _) => Show (HList a :^ as) where
show (x ::^ xs) = show x ++ show xs
но я не уверен, что заполнить дыру _.
PS: Если вы попробуете это в ghci, не забудьте добавить языковые расширения с помощью
:set -XTypeInType -XTypeOperators