如何使用 Regex 和 OverloadedStrings

How to work with Regex and OverloadedString

我一直在文件中使用 Text.Regex.Posix,到目前为止一切正常。 现在,我想将 OverloadedStrings 用于同一个文件中的其他内容。问题是当我激活 OverloadedString 时,所有与 regex 相关的代码都无法编译,因为字符串变得不明确。

有没有一种方法可以解决这个问题,而不必为每个字符串添加类型签名或停用 OverloadedStrings

我在这里看到两种方法。您可以进行一些导入改组,只为您需要的函数添加别名,使其具有不太通用的类型,例如

import qualified Text.Regex.Posix as P
import Text.Regex.Posix hiding ((=~))

(=~) :: RegexContext Regex String target => String -> String -> target
(=~) = (P.=~)

这样您就不必更改整个文件中的代码。但这可能会导致混淆,并且它需要 FlexibleContexts 才能工作(没什么大不了的)。

或者,您可以创建自己的 Python 类语法来指定类型:

r :: String -> String
r = id

u :: Text -> Text
u = id

b :: ByteString -> ByteString
b = id

example :: Bool
example = r"test" =~ r"te.t"

splitComma :: Text -> Text
splitComma = Data.Text.splitOn (u",")

但这需要您编辑更多代码。它不使用任何额外的语言扩展,实现它的代码非常简单,即使与第一种方法相比也是如此。这也意味着您必须更小心地使用括号或 $ 符号,但您也可以使用 rub 函数,嗯,函数。