Haskell のControl.Arrowドキュメントでは、Kleisli の矢印とモナドの関係について説明していますが、これをどのように使用するかは私には明らかではありません。私は IO モナドを除いて矢印に合うと思う関数を持っているので、Kleisli の矢印が役立つと思います。
ディレクトリの元のファイル名と変更されたファイル名のペアを返す次の関数を使用します。
import System.Directory
import System.FilePath
datedFiles target = do
fns <- getDirectoryContents target
tms <- mapM (fmap show . getModificationTime) fns
return $
zip fns $
zipWith replaceBaseName fns $
zipWith (++) (map takeBaseName fns) tms
それを描くとしたら、次のようになります。

Kleisli の矢を使用すると効果があると思いますが、方法がわかりません。誰でもガイダンスを提供できますか?