美好的一天,问题相当无趣,但我坚持下去。
我决定在项目中从简单的字符串迁移到Text并遇到问题,在添加 { - #LANGUAGE OverloadedStrings# - } 后,源代码中的所有字符串都会产生编译错误,例如:
dropWhile (~/= "<li>") tags
现在导致
不明确的类型变量
引起的t' in the constraints:
Data.String.IsString t' 来自文字"<li>"' at ParserOx.hs:93:42-47
TagRep t' 使用“〜==”
这里可能有什么问题?
UPD:
是的,我的所有功能都有签名,例如:
getContainer :: [Tag Text] -> [Tag Text]
getContainer tags =
h
where
(h:t) = sections (~== "<div id=\"itemscontainer\">") tags
答案 0 :(得分:8)
问题是你有一个带有两个约束的模糊类型 - 由重载字符串给出的isstring约束,以及tagsoup用来允许你交替使用标签或字符串的tagrep约束。因此,两种“重载”字符串的方法(一般是一种,一种只是用于tagoup的匹配器)相互碰撞并引起混淆。要么关闭违规文件中的重载字符串,要么将字符串指定为代码中的实际字符串(即(~/= ("<li>"::String))
)。您可以执行以下操作以更安静地强制类型,而不是内联类型签名:
s :: String -> String
s = id
.... (~/= s "<li>") ...
答案 1 :(得分:3)
一种选择是在~==
周围定义一个封装器,它固定该类型的部分。例如,您可以定义:
(~===) a b = a ~== (b :: String)
然后你可以在使用网站上编写(~=== "<div id=\"itemscontainer\">")
而无需进一步注释。
答案 2 :(得分:0)
编译器无法找到您想要的String类型。尝试为您的函数提供明确的签名。