Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 合成一元纯函数_Haskell - Fatal编程技术网

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
您所谓的“点表示法”通常被称为“无点样式”(或者,更轻蔑地说,“无点样式”)。