asg*_*451 2 haskell haskell-wai scotty
我正在尝试创建一个列出给定目录内容的网页,但是我遇到了一个奇怪的问题:当我在GHCi中逐行运行时,代码会生成所需的输出,但是当它在运行中执行时Scotty实例,它产生不同的(错误的)输出.以下是代码的相关部分:
serveDir :: String -> ActionM ()
serveDir p = do let path = prefix ++ p
entries <- liftIO $ getDirectoryContents path
fs <- liftIO $ filterM (doesFileExist . ((++) prefix)) entries
ds <- liftIO $ filterM (doesDirectoryExist . ((++) prefix)) entries
liftIO $ print path >> print entries >> print fs >> print ds
blaze $ renderDir fs ds
where prefix = "static/"
Run Code Online (Sandbox Code Playgroud)
(do语句中的最后一行只是将它呈现为html.这有效,但正确的输出永远不会使它成为该函数)当我在GHCi中运行此函数的每一行时,我得到以下输出:
*Main> entries <- getDirectoryContents "static/stuff"
*Main> fs <- liftIO $ filterM (doesFileExist . ((++) "static/stuff/")) entries
*Main> ds <- liftIO $ filterM (doesDirectoryExist . ((++) "static/stuff/")) entries
*Main> liftIO $ print entries >> print fs >> print ds
["..","hello","bye","someDir","."]
["hello","bye"]
["..","someDir","."]
Run Code Online (Sandbox Code Playgroud)
这是我所期待的.但是当这个函数从Scotty运行时,被称为serveDir "stuff/",我得到这个输出:
"static/stuff/"
["..","hello","bye","someDir","."]
[]
["..","."]
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我知道ActionM是MonadIO的一个实例,否则这将无法编译.我有点失落.有人可以对此有所了解或建议吗?其余代码可根据要求提供,但我可以说我使用wai-middleware-static来允许静态文件请求,而其他函数中来自此目录的其他文件请求也可以.
fs <- liftIO $ filterM (doesFileExist . ((++) prefix)) entries
Run Code Online (Sandbox Code Playgroud)
那应该不是(++) path吗?