[Haskell-beginners] Type families with kind * -> *

Marco Túlio Gontijo e Silva marcot at holoscopio.com
Thu Apr 23 13:15:05 EDT 2009


Hello,

I read the type families example at
http://haskell.org/haskellwiki/GHC/Indexed_types and I wanted to do
something similar to the Collects example, but using a type of kind * ->
*:

> class StateFunctor sf where
>   type SFMonad sf
>   type SFValue sf
>   sfmap :: (SFValue sf -> SFValue sf) -> sf -> SFMonad sf ()

I wrote the instance as:

> instance StateFunctor (ListStore a) where
>   type SFMonad (ListStore a) = IO
>   type SFValue (ListStore a) = a
>   sfmap function listStore
>     = listStoreGetSize listStore >>= listStoreSfmap function listStore

> listStoreSfmap :: (a -> a) -> ListStore a -> Int -> IO ()
> listStoreSfmap _function _listStore 0 = []
> listStoreSfmap function listStore size
>   = listStoreGetValue listStore index
>     >>= listStoreSetValue listStore index . function
>   >> listStoreSfmap function listStore index
>   where
>     index :: Int
>     index = pred size

I'm getting:

DistroCreator/GUI/List.hs:51:47:
    Kind error: `SFMonad' is applied to too many type arguments
    In the type `SFMonad sf ()'
    In the type `sf -> SFMonad sf ()'
    In the type `(SFValue sf -> SFValue sf) -> sf -> SFMonad sf ()'
Failed, modules loaded: none.

How can I use type families with types * -> *?

Greetings.

-- 
marcot
http://marcot.iaaeee.org/




More information about the Beginners mailing list