blaze html,Haskell,正确使用html吗?

blaze html,Haskell,正确使用html吗?,haskell,blaze-html,Haskell,Blaze Html,有两件事我搞不清楚: 1没有{LANGUAGE OverloadedStrings-}纯字符串作为属性参数传递的典型代码都不起作用;不过,只要有指示,一切都很好。它在这种特殊情况下做什么?在生产代码中使用它有多安全 2以下代码:toHtml$失败,但我不太明白: 由文本产生的类型变量“a0”不明确。。。 阻止解决约束“Data.String.IsString a0”。 可能的修复:使用类型注释指定“a0”应该是什么。 这些潜在的例子存在: instance Data.String.IsStrin

有两件事我搞不清楚: 1没有{LANGUAGE OverloadedStrings-}纯字符串作为属性参数传递的典型代码都不起作用;不过,只要有指示,一切都很好。它在这种特殊情况下做什么?在生产代码中使用它有多安全

2以下代码:toHtml$失败,但我不太明白:

由文本产生的类型变量“a0”不明确。。。 阻止解决约束“Data.String.IsString a0”。 可能的修复:使用类型注释指定“a0”应该是什么。 这些潜在的例子存在: instance Data.String.IsString H.AttributeValue-在“blaze-markup-0.8.2.1:Text.blaze.Internal”中定义 实例Data.String.IsString H.标记-在“blaze-markup-0.8.2.1:Text.blaze.Internal”中定义 实例a~Char=>Data.String.IsString[a]-在“Data.String”中定义 …加上10个涉及范围外类型的实例

在标准Haskell中,像foo这样的字符串文本总是被解析为string=[Char]类型的值。Blaze在大多数地方不使用实际的字符串值,而是为每个语义不同的对象使用自己的类型,如AttributeValue。这意味着在标准Haskell中,如果没有重载字符串,就不可能将字符串文本传递给许多Blaze函数,这些函数需要AttributeValue、标记等。当设置-XOverloadedStrings时,GHC将允许字符串文本的类型为Data.string.IsString p=>p而不是string,因此,您可以在任何需要具有IsString实例的类型的地方使用字符串文字。所有标准Blaze代码都使用此代码。OverloadedStrings是一个相当简单的扩展——它基本上是对字符串文本的扩展,就像Num对整数文本的扩展一样——我不知道有多少关于它的争议。我认为在生产代码中使用它应该是安全的,有几个生产代码库使用它

此错误消息是由于toHtml在其第一个参数的类型上被普遍量化,并带有一些约束:toHtml::ToMarkup a=>a->Html,并且对于重载字符串,字符串的类型也是一个类型变量。基本上,GHC知道将被传递到toHtml的字符串文本的类型需要是某种类型,并且该类型需要有ToMarkup和IsString的实例,但是它没有任何方法来确定该类型应该是什么!在本例中,您可能正在寻找字符串文字在此处实际具有类型字符串,您可以通过手动注释文字:toHtml foo::string,或使用-XTypeApplications:toHtml@string foo来获得该类型字符串