
It is hard to tell from your code what you intend, but it works however you want it to, so long as it type checks.
class Frame a where type Whatever a len :: Whatever a -> IO (Maybe Int) row :: Whatever a -> MaybeT IO (DifTomoFrame a DIM1)
instance Frame DataFrameH5Path where type Whatever DataFrameH5Path = DataFrameH5 len = undefined -- :: DataFrameH5 -> IO (Maybe Int) row = undefined -- :: DataFrameH5 -> Int -> MaybeT (DifTomoFrame DataFrameH5Path DIM1)
In fact what I try realy to do is this. data DataFrameH5Path = DataFrameH5Path (DataItem H5) -- image (DataItem H5) -- gamma (DataItem H5) -- delta (DataItem H5) -- wavelength deriving (Show) data DataFrameH5 a = DataFrameH5 (Nxs a) -- Nexus file (DataSource H5) -- gamma (DataSource H5) -- delta (DataSource H5) -- wavelength PoniGenerator -- ponie generator withDataFrameH5 :: (Frame a, MonadSafe m) => File -> Nxs (Key a) -> PoniGenerator -> (a -> m r) -> m r withDataFrameH5 h nxs'@(Nxs _ _ (DataFrameH5Path _ g d w)) gen = bracket (liftIO before) (liftIO . after) where -- before :: File -> DataFrameH5Path -> m DataFrameH5 before :: IO a before = DataFrameH5 <$> return nxs' <*> openDataSource h g <*> openDataSource h d <*> openDataSource h w <*> return gen after :: a -> IO () after (DataFrameH5 _ g' d' w' _) = do closeDataSource g' closeDataSource d' closeDataSource w' I open and hdf5 file and I need to read a bunch of data from this file. the DataFrameH5 is a sort of resource like a File handler. I need a location in the file in order to acce the data, then I need to close the file So I store in the H5 type these resource, that I can release at the end. Ideally I would like to have only The H5Path type and hide the H5 one but I do not know how to do this. I have in fact different H5Path types which necessitate each time there corresponding H5 type. So I want a one for one relation between the H5 <-> H5Path type. Cheers Frederic