我不知道的两件事:
1)没有{-# LANGUAGE OverloadedStrings #-}
,没有任何典型的代码可以将纯字符串作为属性的参数进行传递;但是,只要该指示存在,一切都很好。在这种特殊情况下,它会做什么?在生产代码中使用它的安全性如何?
2)以下代码段:(toHtml $ "<script ... ></script>")
因某些我不太了解的原因而失败:
字面量引起的歧义类型变量“ a0” ... 阻止解决约束“(Data.String.IsString a0)”。 可能的解决办法:使用类型注释来指定应为“ a0”。 这些潜在实例存在: 实例Data.String.IsString H.AttributeValue-定义于'blaze-markup-0.8.2.1:Text.Blaze.Internal' 实例Data.String.IsString H.Tag-在“ blaze-markup-0.8.2.1:Text.Blaze.Internal”中定义 实例a〜Char => Data.String.IsString [a]-在“ Data.String”中定义 ...加上涉及范围外类型的10个实例
答案 0 :(得分:1)
在标准的Haskell中,始终将诸如"foo"
之类的字符串文字解析为String = [Char]
类型的值。 Blaze在大多数地方都不使用实际的String
值,而是对每个语义上不同的事物使用其自己的类型,例如AttributeValue
。这意味着在没有OverloadedStrings
的标准Haskell中,不可能将字符串文字传递给许多期望AttributeValue
,Tag
等的Blaze函数。当您设置{{1} },GHC允许字符串文字的类型为-XOverloadedStrings
而不是Data.String.IsString p => p
,因此您可以在任何需要实例类型为String
的类型的地方使用字符串文字。所有“标准” Blaze代码都使用此代码。 IsString
是一个相当简单的扩展---它基本上是为字符串文字做的,OverloadedStrings
是为整数文字做的---而且我不知道围绕它的任何大量争议。我认为在生产代码中使用它应该是安全的,并且有几个生产代码库都在使用它。
此错误消息是由于以下事实导致的:Num
在其第一个参数的类型上被普遍量化,但有一些限制:toHtml
和--- {{1} }-字符串的类型也是类型变量。基本上,GHC知道要传递给toHtml :: ToMarkup a => a -> Html
的字符串文字的类型必须是某种类型,并且该类型需要具有OverloadedStrings
和toHtml
的实例,但是没有任何方法可以确定该类型应该是什么!在这种情况下,您似乎在这里查找的字符串文字实际上具有类型ToMarkup
,可以通过手动注释文字IsString
或使用String
来获得:toHtml ("foo" :: String)
。