我正在阅读Happstack中的Web路由教程,我不知道这是在做什么:
$(derivePathInfo ''Sitemap)
class PathInfo a where
toPathSegments :: a -> [String]
fromPathSegments :: URLParser a
文档只是说:
我们使用 template-haskell 来派生站点地图类型的 PathInfo 实例。
但是它在哪里"存储"它?我以为Haskell没有状态,PathInfo
是我们自己的事情,还是happstack的一部分?
如果有人可以解释这一点,傻瓜?谢谢。
它生成为站点地图类型定义 PathInfo 类实例的代码。这不是"状态",而是"类型全局常量"。例如,toPathSegments (Article (ArticleId 5))
将返回类似 ["Article", "5"]
的内容,而 又将用于生成类似 "/Article/5"
的 URL。另一个函数,fromPathSegments
,是反向操作,将"/Article/5"
解析回Article (ArticleId 5)
。
您可以手动编写此实例:
instance PathInfo Sitemap where
toPathSegments Home = ["Home"]
toPathSegments (Article (ArticleId x)) = ["Article", show x]
fromPathSegments = ...
模板Haskell仅用于减少对此样板代码的需求。
你可能想阅读《为你学习一个Haskell的伟大善!》一书中关于类型类的章节,这本书是针对Haskell初学者的。