了解Text.Regex.Posix设计选择

时间:2015-08-29 16:10:19

标签: regex haskell module

我和Text.Regex.Posix玩了一下,我找到了这个奇怪的设计选择。

这是我的GHCi会议:

λ> "Needle, Haystack, foo, and bar." =~ "[^ ]+" :: String
"Needle,"
λ> "Needle, Haystack, foo, and bar." =~ "[^ ]+" :: [[String]]
[["Needle,"],["Haystack,"],["foo,"],["and"],["bar."]]
λ> "Needle, Haystack, foo, and bar." =~ "[^ ]+" :: [String]

<interactive>:27:35:
    No instance for (RegexContext Regex [Char] [String])
      arising from a use of ‘=~’
    In the expression:
        "Needle, Haystack, foo, and bar." =~ "[^ ]+" :: [String]
    In an equation for ‘it’:
        it = "Needle, Haystack, foo, and bar." =~ "[^ ]+" :: [String]

我很惊讶地发现,在RegexContext的情况下,RegexLike a b => RegexContext a b [b]没有实例,只有RegexLike a b => RegexContext a b [[b]]

我无法理解为什么使用这种设计。为什么上面没有[String]的实例,为什么它只是[[String]]

1 个答案:

答案 0 :(得分:1)

该实例确实已存在于Text.Regex.Base.Context regex-base-0.83(2007年3月5日上传)中,但已在regex-base-0.90中删除(已于2007年3月13日上传) )。没有更改日志或解释(此时模块文档有一个XXX THIS HADDOCK DOCUMENTATION IS OUT OF DATE XXX注释,直到当前版本为止。)

然而,我最好的猜测至于为什么这样做是因为String[Char]的类型同义词,因此{{1}具有实例}和String会导致重叠的实例问题 - 我认为不是直接的,但足以使类型推断工作严重,特别是如果你使用[b](虽然我不知道是否扩展当时已存在。)