
Hello, thanks for the informations after investigating, I could not switch the IO and the Maybe I need to process the IO in order to know if I have a Just or a Nothing So this is a IO (Maybe ...) I just would like to know if there is a better way to write this knowing len :: IO (Maybe Int) get_position' :: a -> b -> IO (Maybe Double) instance Frame DataFrameH5 where len d = lenH5Dataspace (h5delta d) row d idx = do n' <- len d case n' of (Just n) -> do let eof = n - 1 == idx let nxs' = h5nxs d let mu = 0.0 let komega = 0.0 let kappa = 0.0 let kphi = 0.0 gamma' <- get_position' (h5gamma d) 0 case gamma' of (Just gamma) -> do delta' <- get_position' (h5delta d) idx case delta' of (Just delta) -> do wavelength' <- get_position' (h5wavelength d) 0 case wavelength' of (Just wavelength) -> do let source = Source (head wavelength *~ nano meter) let positions = concat [mu, komega, kappa, kphi, gamma, delta] -- print positions let geometry = Geometry K6c source positions Nothing let detector = ZeroD m <- geometryDetectorRotationGet geometry detector poniext <- ponigen d (MyMatrix HklB m) idx return $ Just DifTomoFrame { difTomoFrameNxs = nxs' , difTomoFrameIdx = idx , difTomoFrameEOF = eof , difTomoFrameGeometry = geometry , difTomoFramePoniExt = poniext } Nothing -> return Nothing Nothing -> return Nothing Nothing -> return Nothing Nothing -> return Nothing where get_position' a b = do v <- get_position a b return $ if any isNaN v then Nothing else Just v Thanks for your help Frederic