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

我对Haskell还是陌生的,但我仍然想尽办法。我正在尝试将两个功能(来自isMark包的Data.Char模块的isAlphabase组合在一起)作为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

不起作用,或者

strippedInput input = T.filter (C.isMark . C.isAlpha) input

,但是显然它也不起作用,因为C.isAlpha的类型为Char -> Bool,然后它成为C.isMark的输入,而Char -> Bool的类型也是C.isMark,因此键入不匹配。

我想在谓词中实现“ C.isAlphadict = {item : values[index] for index,item in enumerate(keys)} ”逻辑,但是由于我的知识非常有限,我已经没有足够的想法来寻找解决方案了。 / p>

azssddd 回答:合并两个函数以将它们应用于相同的输入

最简单的方法是使用 lambda-expression

strippedInput :: Text -> Text
strippedInput input = T.filter (\x -> C.isMark x || C.isAlpha x) input

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

import Control.Applicative(liftA2)

strippedInput :: Text -> Text
strippedInput input = T.filter (liftA2 (||) C.isMark C.isAlpha) input
,

公认的答案是完全正确的。也许我想使用应用运算符;

strippedInput = T.filter $ (||) <$> C.isMark <*> C.isAlpha

然而,liftA2的问题如其名称所示,仅硬连接到两个参数函数,是的,对于该问题可以。但是... Haskell为此工作提供了更合理的 general 抽象。它基本上被称为函数monad,通过添加一些实用程序功能和转换器功能,通常将其概括为Reader monad。但是,为简单起见,我们可以在此处尝试函数monad。

Function / Reader monad不仅用于链接两个函数,而且还链接不确定数量的函数(每个函数带有两个参数),在这种情况下,第一个参数由上一个函数结果提供,第二个参数由一个普通的只读状态(在这种情况是input

所以这个问题的答案也可能像

strippedInput = T.filter (C.isMark >>= (\b c -> b || C.isAlpha c) >>= return)

但是,由于Data.Char程序包中充满了isThisisThat类型的检查,我们可以说明如何扩展这种方法。

strippedInput = T.filter (C.isMark >>= (\b c -> b || C.isAlpha  c)
                                   >>= (\b c -> b || C.isSymbol c)
                                    .
                                    .
                                   >>= return)

和..没有人阻止您进行比较功能,例如

orWith f      = \b c -> b || f c
strippedInput = T.filter $ C.isMark >>= orWith C.isAlpha
                                    >>= orWith C.isSymbol
                                     .
                                     .
                                    >>= return
本文链接:https://www.f2er.com/3164074.html

大家都在问