[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