Haskell 预计到达时间有可能降低吗?
在以下情况下,是否可以应用eta降低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
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)