Markup monad与Html monad有什么关联?

3

我正在使用blaze-html。我最终大部分能够理解如何使用它,但其中一些单子和转换总是让我陷入困境。但这里有一个特别的绊脚石(有很多,但我会把从这里到Happstack的响应和ServerPart单子留到另一天)。

如果我想将字符串文本附加到段落中,我必须使用Text.Blaze.Html5中的此函数:

p . toHtml :: ToMessage a => a -> Html

一切都很好,但是...

关键信息缺失
toHtml :: ToMarkup a => a -> Markup
p :: Html -> Html

我已经尽力查找文档,但是我无法看出Markup单子和Html单子如何相互关联。我该如何处理所有类型和类型类?

1个回答

6

它们是同义词(即它们是相同类型),如文档所示。

此外,将这些类型称为monad是不正确的。它们只是类型。然而,它们是从一个monad (MarkupM)构建的。

作为一个快速检查,如果它是由另一个类型参数化的类型(具有kind * -> *),那么它可以被称为monad。这是必要的(但不充分的)条件。


奇怪。我在本地的cabal / haddock文档中开始处理Text-Blaze-Html5.html,但是Html链接实际上将我指向Text-Blaze-Internal.html。从那里,Html被定义为HtmlM(),它本身被定义为“data HtmlM a”,具有许多实例。没有任何链接指向Text.Blaze.Html中的定义。 - Savanni D'Gerinel
也许你使用的是旧版本的库? - Roman Cheplyaka
文档似乎来自旧版本,@SavanniD'Gerinel,在blaze-html-0.4.*中,toHtml的类型为ToHtml a => a -> Html,那里没有Markup - Daniel Fischer
我仔细研究了一下,Daniel Fischer 和 Roman Cheplyaka 都是正确的。我正在运行0.5.0版本,但是即使安装了0.5.1版本,cabal放入我的文档索引中的haddock文档仍然是0.4.3版本的。这可能是我过于依赖 cabal 作为软件包管理器的又一证明。 - Savanni D'Gerinel
2
啊,我明白了。这是一个已知的 bug(如果我没记错的话,在 Cabal 库中),在最新的 ghc 发布版中已经修复了。问题在于生成本地文档索引时,会选择最旧版本而不是最新版本。你可以通过执行 ghc-pkg unregister blaze-html-0.4.3 然后重新安装新版本来解决它。或者你可以直接在 ~/.cabal/share/doc 中找到正确版本的文档。 - Roman Cheplyaka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接