组合两个函数以将它们应用于相同的输入

mja*_*sie 4 text haskell predicate

我是Haskell的新手,但我仍然想尽办法。我正在尝试将两个函数(isMark以及isAlpha来自包中的Data.Char模块base合并Data.Text.filter函数的第一个参数。到目前为止,我尝试过的是:

import qualified Data.Char as C
import qualified Data.Text as T
import           Data.Text (Text)

strippedInput :: Text -> Text
strippedInput input = T.filter (C.isMark || C.isAlpha) input
Run Code Online (Sandbox Code Playgroud)

这不起作用,或者

strippedInput input = T.filter (C.isMark . C.isAlpha) input
Run Code Online (Sandbox Code Playgroud)

但显然它也不管用,因为类型C.isAlphaIS Char -> Bool然后成为一个输入C.isMark,这也是类型Char -> Bool等等类型不匹配。

我想在谓词中实现“ C.isMarkC.isAlpha”逻辑,但是由于我的知识非常有限,我对如何搜索解决方案的想法已经用尽。

Wil*_*sem 6

最简单的是使用lambda-expression

strippedInput :: Text -> Text
strippedInput input = T.filter (\x -> C.isMark x || C.isAlpha x) input
Run Code Online (Sandbox Code Playgroud)

您还可以利用函数是应用函子的事实,从而可以使用:

import Control.Applicative(liftA2)

strippedInput :: Text -> Text
strippedInput input = T.filter (liftA2 (||) C.isMark C.isAlpha) input
Run Code Online (Sandbox Code Playgroud)

  • 如果您发现自己做的很多,那么在IMO中定义`(<||>)= liftA2(||)`就很简单了,这样您就可以编写`strippedInput = T.filter(C.isMark <||> C .isAlpha)`。 (3认同)