让我们找到当前目录中不存在的文件:
filterM (\f -> return . not =<< doesFileExist f) files
现在我想用点符号做得更好:
filterM (liftM not . doesFileExist) files
还有其他办法吗?例如,后来的作品不太适合纯函数的组合,需要大括号:
filterM (liftM (isExtensionPNG . not) . doesFileExist) files
答案 0 :(得分:2)
由于每个monad都是liftM
为fmap
的仿函数,因此您可以使用fmap
分布于函数组合的事实。
fmap (f . g) = fmap f . fmap g
你可以写
filterM (liftM isExtensionPNG . liftM not . doesFileExist) files
虽然说实话,我更喜欢你原来的版本。
答案 1 :(得分: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