在Web路由中派生PathInfo类?

时间:2012-06-24 15:11:55

标签: haskell happstack

我正在阅读哈普斯塔克的web-routes tutorial,我不知道这是做什么的:

$(derivePathInfo ''Sitemap)

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

该文件只是说:

  

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

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

如果有人可以解释这个,对于傻瓜?感谢。

1 个答案:

答案 0 :(得分: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仅用于减少对此样板代码的需求。

您可能希望阅读针对Haskell初学者的the chapter on type classes一书中的Learn You a Haskell for Great Good!