
Hello, I have this class DataSource data family DataSourcePath a :: Type data family DataSourceAcq a :: Type class DataSource a where withDataSourceP :: (Location l, MonadSafe m) => l -> DataSourcePath a -> (DataSourceAcq a -> m r) -> m r The purpose is to acquire a ressources from a data source path (for example, in a hdf5 file, "hdf5://path/to/my/dataset" I need to obtain a C struct which point on the Dataset) and then do something with this ressources Here an example of an instance in order to extract an Angstrom from a file or provide directly the constant value. -- Angstrom data instance DataSourcePath Angstrom = DataSourcePath'Angstrom (Hdf5Path Z Double) | DataSourcePath'Angstrom'Const Angstrom deriving (Eq, Generic, Show, FromJSON, ToJSON) data instance DataSourceAcq Angstrom = DataSourceAcq'Angstrom Dataset | DataSourceAcq'Angstrom'Const Angstrom instance DataSource Angstrom where withDataSourceP f (DataSourcePath'Angstrom p) g = withHdf5PathP f p $ \ds -> g (DataSourceAcq'Angstrom ds) withDataSourceP _ (DataSourcePath'Angstrom'Const a) g = g (DataSourceAcq'Angstrom'Const a) next, I build a bunch of DataFrame which contain all these ressources. data DataFrameQCustom = DataFrameQCustom Attenuation -- attenuation Geometry -- geometry Image -- image Index -- timestamp in double deriving Show data instance DataSourcePath DataFrameQCustom = DataSourcePath'DataFrameQCustom (DataSourcePath Attenuation) (DataSourcePath Geometry) (DataSourcePath Image) (DataSourcePath Index) deriving (Eq, Generic, Show, FromJSON, ToJSON) data instance DataSourceAcq DataFrameQCustom = DataSourceAcq'DataFrameQCustom (DataSourceAcq Attenuation) (DataSourceAcq Geometry) (DataSourceAcq Image) (DataSourceAcq Index) Indded I now need to write the withDataSource instance by hand instance DataSource DataFrameQCustom where withDataSourceP f (DataSourcePath'DataFrameQCustom a g i idx) gg = withDataSourceP f a $ \a' -> withDataSourceP f g $ \g' -> withDataSourceP f i $ \i' -> withDataSourceP f idx $ \idx' -> gg (DataSourceAcq'DataFrameQCustom a' g' i' idx') this seems so mechanical that I am wondring if this should not be automatize via Generic. Another point would be to avoiding mistake when writting the DatasourcePath instance and Generate the from an uniq structure using HKD Something like -- "Higher-Kinded Data" type family HKD f a where HKD Identity a = a HKD f a = f a data DataFrameHkl' f = DataFrameHkl (HKD f DataFrameQCustom) (HKD f Sample) deriving (Generic) type DataFrameHkl = DataFrameHkl' Identity type DataFrameHklPath = DataFrameHkl' DataSourcePath so I would like your help in order to write first a Generic version of withDataSourceP I read this https://reasonablypolymorphic.com/blog/higher-kinded-data/ but I am not completly sure how to convert my withDataSourceP :: (Location l, MonadSafe m) => l -> DataSourcePath a -> (DataSourceAcq a -> m r) -> m r signature into something Generic Thanks for considering Fred
participants (1)
-
PICCA Frederic-Emmanuel