我尝试使用库regex-applicative。
我的代码是:
nicBeg = ((psym $ not . isSpace) $> (few anySym <> " adapter ")) *> some anySym
result = match nicBeg "abcd adapter NIC 1"
我 认为result
是 的Just "bcd adapter NIC 1"
.
但文献记载*>
表明:
*> :: forall (f :: Type -> Type) a b.Applicative f => fa -> fb -> fb
在‘GHC.Base’(base-4.16.4.0)中定义的
序列动作,丢弃第一个参数的值。
那么,问题是:为什么“bcd 适配器”部分存在于result
而不是只有“NIC 1”(它没有被丢弃)?是库的问题还是我哪里错了?
PS. 该库具有“贪婪” RE 表达式的概念。
PS. 很容易得到预期的结果:(((psym $ not . isSpace) *> (few anySym <> " adapter ")) *> some anySym
即替换$>
为*>
)
是一个非常奇怪的表达式。我不确定你想让它表示什么意思,但因为
($>)
是 的翻转版本(<$)
,所以它的意思是“匹配正则表达式(psym $ not . isSpace)
,然后用 替换你解析的值(few anySym <> " adapter ")
”。重要的是,(few anySym <> " adapter ")
根本不用作正则表达式。它是与解析单个非空格字符相关的值。然后,当然,*> some anySym
正如你所期望的那样, 会丢弃该值,并尝试将剩余的字符串(即"bcd adapter NIC 1"
)与 进行匹配some anySym
,结果可预测。所以最后你
(*>)
根本不是对 感到困惑,而是对 感到困惑($>)
。amalloy 解释了你错在哪里,但让我只谈谈你的问题的一小部分:
它不是,也不可能是
*>
。丢弃左操作数的结果这一事实由其类型保证。多态类型变量
a
仅出现在函数类型的“负”位置,没有任何内容将其与结果中的类型联系起来。因此,它*>
对该类型一无所知,也无法使用该类型的值(除非强制使用它们)。