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

时间:2018-07-03 22:05:17

标签: haskell blaze-html

我不知道的两件事: 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个实例

1 个答案:

答案 0 :(得分:1)

  1. 在标准的Haskell中,始终将诸如"foo"之类的字符串文字解析为String = [Char]类型的值。 Blaze在大多数地方都不使用实际的String值,而是对每个语义上不同的事物使用其自己的类型,例如AttributeValue。这意味着在没有OverloadedStrings的标准Haskell中,不可能将字符串文字传递给许多期望AttributeValueTag等的Blaze函数。当您设置{{1} },GHC允许字符串文字的类型为-XOverloadedStrings而不是Data.String.IsString p => p,因此您可以在任何需要实例类型为String的类型的地方使用字符串文字。所有“标准” Blaze代码都使用此代码。 IsString是一个相当简单的扩展---它基本上是为字符串文字做的,OverloadedStrings是为整数文字做的---而且我不知道围绕它的任何大量争议。我认为在生产代码中使用它应该是安全的,并且有几个生产代码库都在使用它。

  2. 此错误消息是由于以下事实导致的:Num在其第一个参数的类型上被普遍量化,但有一些限制:toHtml和--- {{1} }-字符串的类型也是类型变量。基本上,GHC知道要传递给toHtml :: ToMarkup a => a -> Html的字符串文字的类型必须是某种类型,并且该类型需要具有OverloadedStringstoHtml的实例,但是没有任何方法可以确定该类型应该是什么!在这种情况下,您似乎在这里查找的字符串文字实际上具有类型ToMarkup,可以通过手动注释文字IsString或使用String来获得:toHtml ("foo" :: String)