如何定义元组中包含的变量?

时间:2016-08-04 21:38:12

标签: haskell happstack

每次我尝试运行此代码时,编译器都会为变量redirectUrlGraphEmailredirectUrlGraphPostaboutContentsstaticDir返回“not in scope”错误:

routes :: [ (String, ServerPart Response)]
routes = [
("graph-fb", seeOther redirectUrlGraphEmail $ toResponse ""),
("post-fb", seeOther redirectUrlGraphPost $ toResponse ""),               
("about", aboutResponse aboutContents),
("static", serveDirectory DisableBrowsing [] staticDir)]

这些变量由:

声明
staticDir <- getStaticDir
redirectUrlGraphEmail <- retrieveAuthURL testUrl
redirectUrlGraphPost <- retrieveAuthURL testPostUrl
aboutContents <- LazyIO.readFile $ markdownPath ++ "README.md"
privacyContents <- LazyIO.readFile $ markdownPath ++ "PRIVACY.md"

但我不确定在哪里将这些行添加到模块中。这里有什么帮助吗?

1 个答案:

答案 0 :(得分:4)

我不知道快乐堆叠,但似乎您的变量redirectUrlGraphEmail等在您的主要(或至少在某些monad)中定义,对吧?然后,您希望将route定义为模块中的单独函数。

问题是,您在<-中定义的变量(您与main精确绑定)是main的本地变量,因此您的其他程序不会&# 39;有权访问它们(这就是为什么当你试图在routes中使用它们时编译器告诉你它们不在范围内)。如果你想使用它们,你需要将routes定义为将它们作为参数的函数,所以在你的情况下:

routes redirectUrlGraphEmail redirectUrlGraphPost = [
 ("graph-fb", seeOther redirectUrlGraphEmail $ toResponse ""),
 ("post-fb", seeOther redirectUrlGraphPost $ toResponse ""),               
 ("about", aboutResponse aboutContents),
 ("static", serveDirectory DisableBrowsing [] staticDir)]

然后从你的main电话routes开始,使用您已绑定的变量。我有道理吗?