C'est un peu difficile à expliquer, mais j'ai rencontré cette situation plusieurs fois.
Le code est le suivant :
work :: String -> IO ()
work a = do
input <- lines <$> getContents
sortF <- let f = flip sortByM input
in case a of
"name" -> f (return . id :: FilePath -> IO FilePath)
"time" -> f (getModificationTime :: FilePath -> IO UTCTime)
_ -> f (getModificationTime :: FilePath -> IO UTCTime)
print sortF
sortByM :: (Monad m, Ord a) => (b-> m a) -> [b] -> m [b]
sortByM f x = do
x' <- mapM f x
return $ fst <$> (sortBy (comparing snd) $ zip x x')
L'erreur ci-dessus est la suivante :
• Impossible d'associer le type ‘UTCTime’ avec ‘[Char]’
Type attendu: String -> IO FilePath
Type actuel : FilePath -> IO UTCTime
• Dans le premier argument de ‘f’, à savoir
‘(getModificationTime :: FilePath -> IO UTCTime)’
Dans l'expression :
f (getModificationTime :: FilePath -> IO UTCTime)
Dans une alternative de cas :
"time" -> f (getModificationTime :: FilePath -> IO UTCTime)
Cela a du sens, mais y a-t-il un moyen d'obtenir le résultat souhaité d'une certaine manière ? Sinon, je devrai compléter comme ci-dessous, ce qui semble moins maintenable :
work :: String -> IO ()
work a = do
input <- lines <$> getContents
sortF <- case a of
"name" -> flip sortByM input (return . id :: FilePath -> IO FilePath)
"time" -> flip sortByM input (getModificationTime :: FilePath -> IO UTCTime)
_ -> flip sortByM input (getModificationTime :: FilePath -> IO UTCTime)
print sortF
sortByM :: (Monad m, Ord a) => (b-> m a) -> [b] -> m [b]
sortByM f x = do
x' <- mapM f x
return $ fst <$> (sortBy (comparing snd) $ zip x x')