我一直Text.Regex.Posix
在文件中使用,到目前为止一切正常。现在,我想OverloadedStrings
在同一个文件中使用其他东西。问题是当我激活OverloadedString
所有与regex
不编译相关的代码时,因为字符串变得不明确。
有没有办法解决这个问题而不必为每个字符串添加类型签名或停用OverloadedStrings
?
我一直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
函数用作函数。