1

让我们查找当前目录中不存在的文件:

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

现在我想用点符号做得更好:

filterM (liftM not . doesFileExist) files

还有其他方法可以做到这一点吗?例如,后来的工作对于纯函数的组合不太好,需要大括号:

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

2 回答 2

2

由于每个 monad 都是带有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 回答