Eu tento usar uma biblioteca regex-applicative .
Meu código é:
nicBeg = ((psym $ not . isSpace) $> (few anySym <> " adapter ")) *> some anySym
result = match nicBeg "abcd adapter NIC 1"
e vejo que result
é Just "bcd adapter NIC 1"
.
Mas a documentação *>
diz:
*> :: forall (f :: Tipo -> Tipo) a b. Aplicativo f => fa -> fb -> fb
Definido em 'GHC.Base' (base-4.16.4.0)
Ações de sequência, descartando o valor do primeiro argumento.
Então, a questão é: por que a parte "bcd adapter" existe no result
e não apenas "NIC 1" (ele não foi descartado )? É um problema da biblioteca ou estou errado em algum lugar?
PS. A biblioteca tem um conceito de expressões RE "gananciosas".
PS. É fácil obter um resultado esperado: ((psym $ not . isSpace) *> (few anySym <> " adapter ")) *> some anySym
(ou seja, substituir $>
por *>
)
é uma expressão muito estranha. Não tenho certeza do que você quer que signifique, mas como
($>)
é uma versão invertida de(<$)
, significa "corresponda à expressão regular(psym $ not . isSpace)
, e então substitua o valor que você analisou por(few anySym <> " adapter ")
". Importante,(few anySym <> " adapter ")
não está sendo usado como uma expressão regular de forma alguma . É o valor associado à análise de um único caractere sem espaço. Então, é claro,*> some anySym
descarta esse valor, assim como você espera, e tenta corresponder a string restante (ou seja,"bcd adapter NIC 1"
) contrasome anySym
, com resultados previsíveis.Então no final você não fica confuso sobre
(*>)
nada, mas sim sobre($>)
.amalloy explicou onde você errou, mas deixe-me abordar apenas um pequeno trecho da sua pergunta:
Não é, e não pode ser . O fato de que
*>
descarta o(s) resultado(s) do operando esquerdo é garantido por seu tipo.A variável do tipo polimórfico
a
só aparece em uma posição "negativa" no tipo de função, sem nada para conectá-la aos tipos no resultado. Então*>
não "sabe" nada sobre esse tipo e não pode usar valores desse tipo de forma alguma (exceto para forçá-los).