Haskell 合成一元纯函数
让我们查找当前目录中不存在的文件:Haskell 合成一元纯函数,haskell,Haskell,让我们查找当前目录中不存在的文件: filterM (\f -> return . not =<< doesFileExist f) files 还有其他方法可以做到这一点吗?例如,对于纯函数的组合,后期效果不太好,需要大括号: filterM (liftM (isExtensionPNG . not) . doesFileExist) files 由于每个单子都是一个函子,其liftM与fmap相同,因此可以使用fmap分布在函数组合中这一事实 fmap (f . g)
filterM (\f -> return . not =<< doesFileExist f) files
还有其他方法可以做到这一点吗?例如,对于纯函数的组合,后期效果不太好,需要大括号:
filterM (liftM (isExtensionPNG . not) . doesFileExist) files
由于每个单子都是一个函子,其
liftM
与fmap
相同,因此可以使用fmap
分布在函数组合中这一事实
fmap (f . g) = fmap f . fmap g
因此,你可以写作
filterM (liftM isExtensionPNG . liftM not . doesFileExist) files
老实说,我更喜欢你的原始版本。因为每个单子都是一个带有
liftM
作为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
您可以定义中缀运算符,以便更好地编写:
infixr 9 .: -- same as .
(.:) :: Monad m => (b -> c) -> (a -> m b) -> a -> m c
f .: g = liftM f . g
filterM (isExtensionPNG .: not .: doesFileExist) files
我认为最后一个例子没有达到你的目的。要进行类型检查,
isExtensionPNG
必须具有Bool->Bool
类型,这没有多大意义。同意@hammar,您可能不想使用。isExtensionPNG
您所谓的“点表示法”通常被称为“无点样式”(或者更轻蔑地说是“无点样式”)。我认为最后一个示例并没有达到您的目的。要进行类型检查,isExtensionPNG
必须具有Bool->Bool
类型,这没有多大意义。同意@hammar,您可能不想使用。isExtensionPNG
您所谓的“点表示法”通常被称为“无点样式”(或者,更轻蔑地说,“无点样式”)。