构成一元和纯粹的功能

时间:2012-04-19 07:07:43

标签: haskell

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

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

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

filterM (liftM not . doesFileExist) files

还有其他办法吗?例如,后来的作品不太适合纯函数的组合,需要大括号:

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

2 个答案:

答案 0 :(得分:2)

由于每个monad都是liftMfmap的仿函数,因此您可以使用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