我和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]]
?
答案 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]
(虽然我不知道是否扩展当时已存在。)