Семейство типов типа Хаскелл

В Haskell я могу написать класс с объявлением type для создания семейства типов, например:

class ListLike k where
    type Elem ::  * -> *
    fromList :: [Elem k] -> k

И затем напишите такие экземпляры:

instance ListLike [a] where
    type Elem [a] = a
    fromList = id

instance ListLike Bytestring where
    type Elem Bytestring = Char
    fromList = pack

Я знаю, что вы можете создавать типы типов и функции уровня в Idris, но методы работают с данными данного типа, а не с самим типом.

Как я могу создать семейство типов с ограничениями типа в Idris, как указано выше?

Ответ 1

У меня нет подсказки, если вы когда-нибудь найдете это для использования, но я думаю, что очевидный перевод должен быть

class ListLike k where
    llElem : Type
    fromList : List llElem -> k

instance ListLike (List a) where
    llElem = a
    fromList = id

instance ListLike (Maybe a) where
  llElem = a
  fromList [] = Nothing
  fromList (a::_) = Just a

Использование

λΠ> the (Maybe Int) (fromList [3])
Just 3 : Maybe Int
λΠ> the (List Int) (fromList [3])
[3] : List Int