每次我尝试运行此代码时,编译器都会为变量redirectUrlGraphEmail
,redirectUrlGraphPost
,aboutContents
和staticDir
返回“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"
但我不确定在哪里将这些行添加到模块中。这里有什么帮助吗?
答案 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
开始,使用您已绑定的变量。我有道理吗?