我正在阅读哈普斯塔克的web-routes tutorial,我不知道这是做什么的:
$(derivePathInfo ''Sitemap)
class PathInfo a where
toPathSegments :: a -> [String]
fromPathSegments :: URLParser a
该文件只是说:
我们使用template-haskell为Sitemap类型派生PathInfo实例。
但它在哪里“存储”它?我认为haskell没有状态,PathInfo
是我们自己的东西,还是它是幸福堆的一部分?
如果有人可以解释这个,对于傻瓜?感谢。
答案 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!。