1

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

有没有办法解决这个问题而不必为每个字符串添加类型签名或停用OverloadedStrings

4

1 回答 1

3

我在这里看到两种方法。您可以进行一些导入改组,并将您需要的函数别名为不那么通用的类型,例如

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函数用作函数。

于 2015-04-23T21:03:11.167 回答