Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/intellij-idea/3.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_Pointfree - Fatal编程技术网

Haskell 预计到达时间有可能降低吗?

Haskell 预计到达时间有可能降低吗?,haskell,pointfree,Haskell,Pointfree,在以下情况下,是否可以应用eta降低 let normalise = filter (\x -> Data.Char.isLetter x || Data.Char.isSpace x ) 我期待着这样的事情成为可能: let normalise = filter (Data.Char.isLetter || Data.Char.isSpace) …但它不是您可以利用任何幺半群和幺半群实例来返回幺半群值的函数: import Data.Monoid import Data.Char

在以下情况下,是否可以应用eta降低

let normalise = filter (\x -> Data.Char.isLetter x || Data.Char.isSpace x )
我期待着这样的事情成为可能:

let normalise = filter (Data.Char.isLetter || Data.Char.isSpace)

…但它不是

您可以利用
任何
幺半群和幺半群实例来返回幺半群值的函数:

import Data.Monoid
import Data.Char

let normalise = filter (getAny . ((Any . isLetter) `mappend` (Any . isSpace)))

您的解决方案不起作用,因为
(| |)
Bool
值起作用,
Data.Char.islater
Data.Char.isSpace
属于
Char->Bool
类型

给你:

$ pl "f x = a x || b x"
f = liftM2 (||) a b
说明:
liftM2
(| |)提升到
)r
单子,因此它的新类型是
(r->Bool)->(r->Bool)->(r->Bool)

因此,在您的情况下,我们将得到:

import Control.Monad
let normalise = filter (liftM2 (||) Data.Char.isLetter Data.Char.isSpace)
导入控件。应用程序
让normalise=filter((| |)Data.Char.isleter Data.Char.isSpace)

另一个值得一看的解决方案是箭头

import Control.Arrow

normalize = filter $ uncurry (||) . (isLetter &&& isSpace)
&&&
接受两个函数(实际上是箭头),并将它们的结果压缩到一个元组中。然后我们就不急躁了,所以时间到了,我们都完了

这个()的一个很好的补充是定义
()=liftM2(| |)
,然后您可以将它用作
过滤器(Isleter isSpace)
,甚至可以继续组合这些过滤器(Isleter isSpace(='1'))。我觉得这种风格特别容易使用,也很吸引人。
import Control.Arrow

normalize = filter $ uncurry (||) . (isLetter &&& isSpace)