[Haskell-cafe] Is there a way to make this code compose generic ?
PICCA Frederic-Emmanuel
frederic-emmanuel.picca at synchrotron-soleil.fr
Wed Apr 9 08:23:04 UTC 2025
Hello
Li-yao
thanks a lot for you explanations, it helps me a lot.
I end up with this error (beware the long error message...)
src/Hkl/Binoculars/Projections/Config/Sample.hs:68:14: error: [GHC-39999]
• Could not deduce ‘Hkl.DataSource.GDataSourceAcq
(GHC.Generics.C1
(GHC.Generics.MetaCons
"DataSourceT'Sample" GHC.Generics.PrefixI False)
(((GHC.Generics.S1
(GHC.Generics.MetaSel
Nothing
GHC.Generics.NoSourceUnpackedness
GHC.Generics.NoSourceStrictness
GHC.Generics.DecidedLazy)
(GHC.Generics.Rec0 (DataSourceT DSAcq Double))
GHC.Generics.:*: GHC.Generics.S1
(GHC.Generics.MetaSel
Nothing
GHC.Generics.NoSourceUnpackedness
GHC.Generics.NoSourceStrictness
GHC.Generics.DecidedLazy)
(GHC.Generics.Rec0 (DataSourceT DSAcq Double)))
GHC.Generics.:*: (GHC.Generics.S1
(GHC.Generics.MetaSel
Nothing
GHC.Generics.NoSourceUnpackedness
GHC.Generics.NoSourceStrictness
GHC.Generics.DecidedLazy)
(GHC.Generics.Rec0 (DataSourceT DSAcq Double))
GHC.Generics.:*: GHC.Generics.S1
(GHC.Generics.MetaSel
Nothing
GHC.Generics.NoSourceUnpackedness
GHC.Generics.NoSourceStrictness
GHC.Generics.DecidedLazy)
(GHC.Generics.Rec0
(DataSourceT DSAcq Degree))))
GHC.Generics.:*: ((GHC.Generics.S1
(GHC.Generics.MetaSel
Nothing
GHC.Generics.NoSourceUnpackedness
GHC.Generics.NoSourceStrictness
GHC.Generics.DecidedLazy)
(GHC.Generics.Rec0 (DataSourceT DSAcq Degree))
GHC.Generics.:*: GHC.Generics.S1
(GHC.Generics.MetaSel
Nothing
GHC.Generics.NoSourceUnpackedness
GHC.Generics.NoSourceStrictness
GHC.Generics.DecidedLazy)
(GHC.Generics.Rec0
(DataSourceT DSAcq Degree)))
GHC.Generics.:*: (GHC.Generics.S1
(GHC.Generics.MetaSel
Nothing
GHC.Generics.NoSourceUnpackedness
GHC.Generics.NoSourceStrictness
GHC.Generics.DecidedLazy)
(GHC.Generics.Rec0
(DataSourceT DSAcq Degree))
GHC.Generics.:*: (GHC.Generics.S1
(GHC.Generics.MetaSel
GHC.Generics.NoSourceUnpackedness
GHC.Generics.NoSourceStrictness
GHC.Generics.DecidedLazy)
(GHC.Generics.Rec0
(DataSourceT
DSAcq
Degree))
GHC.Generics.:*: GHC.Generics.S1
(GHC.Generics.MetaSel
Nothing
GHC.Generics.NoSourceUnpackedness
GHC.Generics.NoSourceStrictness
GHC.Generics.DecidedLazy)
(GHC.Generics.Rec0
(DataSourceT
DSAcq
Degree))))))
GHC.Generics.:+: GHC.Generics.C1
(GHC.Generics.MetaCons
"DataSourceT'Sample'Or" GHC.Generics.PrefixI False)
(GHC.Generics.S1
(GHC.Generics.MetaSel
Nothing
GHC.Generics.NoSourceUnpackedness
GHC.Generics.NoSourceStrictness
GHC.Generics.DecidedLazy)
(GHC.Generics.Rec0 (DataSourceT DSAcq Sample))
GHC.Generics.:*: GHC.Generics.S1
(GHC.Generics.MetaSel
Nothing
GHC.Generics.NoSourceUnpackedness
GHC.Generics.NoSourceStrictness
GHC.Generics.DecidedLazy)
(GHC.Generics.Rec0
(DataSourceT DSAcq Sample))))’
Nothing
arising from a use of ‘generic'ds'Shape’
from the context: Pipes.Safe.MonadSafe m
bound by the type signature for:
ds'Shape :: forall (m :: * -> *).
Pipes.Safe.MonadSafe m =>
DataSourceT DSAcq Sample -> m DataSourceShape
at src/Hkl/Binoculars/Projections/Config/Sample.hs:68:3-10
• In the expression: generic'ds'Shape
In an equation for ‘ds'Shape’: ds'Shape = generic'ds'Shape
In the instance declaration for ‘DataSource Sample’
|
68 | ds'Shape = generic'ds'Shape
| ^^^^^^^^^^^^^^^^
It works great if I have this type.
instance DataSource Sample where
data DataSourceT k Sample
= DataSourceT'Sample
(DataSourceT k Double) -- a
(DataSourceT k Double) -- b
(DataSourceT k Double) -- c
(DataSourceT k Degree) -- alpha
(DataSourceT k Degree) -- beta
(DataSourceT k Degree) -- gamma
(DataSourceT k Degree) -- ux
(DataSourceT k Degree) -- uy
(DataSourceT k Degree) -- uz
deriving (Generic)
ds'Shape = generic'ds'Shape
but not If I need to add this other constructor
| DataSourceT'Sample'Or (DataSourceT k Sample) (DataSourceT k Sample)
is it connected to this ?
GHC.Generics.:+: GHC.Generics.C1
There is no instance for :+: in your proposition.
These `Or` Constructor are usefull with the default withDatasourcePOr of the cladd DataSource , it is a sort of fallback.
try the first and if something goes wrong try the second one.
withDataSourcePOr ∷ (Location l, MonadSafe m)
⇒ ScanFile l → DataSourceT DSPath a → DataSourceT DSPath a → (DataSourceT DSAcq a → m r) → m r
withDataSourcePOr f l r g = withDataSourceP f l g
`catch`
λexl → withDataSourceP f r g
`catch`
λexr → throwM $ CanNotOpenDataSource'Or exl exr
This is how I define the fallback when declaring the instance from this Or constructor
withDataSourceP f (DataSourcePath'Sample'Or l r) g = withDataSourcePOr f l r g
I don ot know if this is the right design...
thanks
Fred
More information about the Haskell-Cafe
mailing list