如何使用 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",")
但这需要您编辑更多代码。它不使用任何额外的语言扩展,实现它的代码非常简单,即使与第一种方法相比也是如此。这也意味着您必须更小心地使用括号或 $
符号,但您也可以使用 r
、u
和 b
函数,嗯,函数。
我一直在文件中使用 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",")
但这需要您编辑更多代码。它不使用任何额外的语言扩展,实现它的代码非常简单,即使与第一种方法相比也是如此。这也意味着您必须更小心地使用括号或 $
符号,但您也可以使用 r
、u
和 b
函数,嗯,函数。