1

現在のディレクトリに存在しないファイルを見つけてみましょう。

filterM (\f -> return . not =<< doesFileExist f) files

そして今、私はポイント記法でそれをより良くしたいと思っています:

filterM (liftM not . doesFileExist) files

これを行う別のアプローチはありますか?たとえば、後で純粋な関数の構成にはあまり適していません。中かっこが必要です。

filterM (liftM (isExtensionPNG . not) . doesFileExist) files
4

2 に答える 2

2

すべてのモナドはliftMasを持つファンクターであるため、関数合成に分散するfmapという事実を利用できます。fmap

fmap (f . g) = fmap f . fmap g

したがって、次のように書くことができます

filterM (liftM isExtensionPNG . liftM not . doesFileExist) files

正直なところ、私はあなたの元のバージョンの方が好きです。

于 2012-04-19T07:56:59.043 に答える
2

中置演算子を定義して、書きやすくすることができます。

infixr 9 .: -- same as .

(.:) :: Monad m => (b -> c) -> (a -> m b) -> a -> m c
f .: g = liftM f . g


filterM (isExtensionPNG .: not .: doesFileExist) files
于 2012-04-19T08:23:18.050 に答える