哈斯克尔。带有OverloadedStrings的TagSoup库

时间:2011-09-08 17:35:40

标签: haskell

美好的一天,问题相当无趣,但我坚持下去。

我决定在项目中从简单的字符串迁移到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

3 个答案:

答案 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类型。尝试为您的函数提供明确的签名。