Yield in your producer is of type DataFrameHkI3D -> Producer DataFrameHkl3D IO ()
But you are putting an (IO DataFrameHkI3D) in as an argument.
You should be able to do something like this:
getDataFrameHkl3D :: DataFrameHkl3DH5SixsUhv -> Producer DataFrameHkl3D IO ()
getDataFrameHkl3D d = do
n <- lift $ hkl_h5_len (h5mu d)
frames <- forM [0..n] $ \i -> lift (getDataFrameHkl3D' d i) -- :: Producer DataFrameHkl3D IO [DataFrameHkl3D]
forM_ frames yield
I have a feeling it may be more efficient to yield immediately on each loop as such:
getDataFrameHkl3D :: DataFrameHkl3DH5SixsUhv -> Producer DataFrameHkl3D IO ()
getDataFrameHkl3D d = do
n <- lift $ hkl_h5_len (h5mu d)
forM_ [0..n] (\i -> lift (getDataFrameHkl3D' d i) >>= yield)
You may also substitutde liftIO for lift, if you wish.