1

我正在阅读 Happstack 中的网络路由教程,但我不知道这是在做什么:

$(derivePathInfo ''Sitemap)

class PathInfo a where
  toPathSegments :: a -> [String]
  fromPathSegments :: URLParser a

文档只是说:

我们使用 template-haskell 为 Sitemap 类型派生 PathInfo 的实例。

但它在哪里“存储”它?我认为haskell没有状态,是PathInfo我们自己的东西,还是happstack的一部分?

如果有人可以解释一下,对于傻瓜?谢谢。

4

1 回答 1

3

它生成为 Sitemap 类型定义 PathInfo 类实例的代码。这不像“类型全局常量”那样是“状态”。例如,toPathSegments (Article (ArticleId 5))将返回类似["Article", "5"]的内容,而后者又将用于生成类似"/Article/5". 另一个函数 ,fromPathSegments是逆运算,解析"/Article/5"Article (ArticleId 5).

您可以手动编写此实例:

instance PathInfo Sitemap where
    toPathSegments Home = ["Home"]
    toPathSegments (Article (ArticleId x)) = ["Article", show x]
    fromPathSegments = ...

模板 Haskell 仅用于减少对该样板代码的需求。

你可能想阅读《 Learn You a Haskell for Great Good!》一书中关于类型类的章节!这是针对 Haskell 初学者的。

于 2012-06-24T16:13:22.663 回答