In Haskell, I might write a typeclass with a type
declaration to create a type family, like so:
class ListLike k where
type Elem :: * -> *
fromList :: [Elem k] -> k
And then write instances like this:
instance ListLike [a] where
type Elem [a] = a
fromList = id
instance ListLike Bytestring where
type Elem Bytestring = Char
fromList = pack
I'm aware that you can create typeclasses and type-level functions in Idris, but the methods operate on data of the given type, not the type itself.
How can I make a typeclass-constrained type family in Idris like the one above?
I have no clue if you will ever find a use for this, but I think the obvious translation should be
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With