让我们查找当前目录中不存在的文件:
filterM (\f -> return . not =<< doesFileExist f) files
现在我想用点符号做得更好:
filterM (liftM not . doesFileExist) files
还有其他方法可以做到这一点吗?例如,后来的工作对于纯函数的组合不太好,需要大括号:
filterM (liftM (isExtensionPNG . not) . doesFileExist) files
让我们查找当前目录中不存在的文件:
filterM (\f -> return . not =<< doesFileExist f) files
现在我想用点符号做得更好:
filterM (liftM not . doesFileExist) files
还有其他方法可以做到这一点吗?例如,后来的工作对于纯函数的组合不太好,需要大括号:
filterM (liftM (isExtensionPNG . not) . doesFileExist) files
由于每个 monad 都是带有liftM
as的函子,因此您可以使用分布在函数组合上fmap
的事实。fmap
fmap (f . g) = fmap f . fmap g
因此你可以写
filterM (liftM isExtensionPNG . liftM not . doesFileExist) files
虽然老实说,我更喜欢你的原始版本。
您可以定义一个中缀运算符以使其更好地编写:
infixr 9 .: -- same as .
(.:) :: Monad m => (b -> c) -> (a -> m b) -> a -> m c
f .: g = liftM f . g
filterM (isExtensionPNG .: not .: doesFileExist) files