为什么这在 GHCi 中有效但在 Scotty 中无效?
Why does this work in GHCi but not Scotty?
我正在尝试制作一个列出给定目录内容的网页,但我 运行 遇到了一个奇怪的问题:当我 运行 它时,代码会产生所需的输出在 GHCi 中逐行执行,但在 运行ning 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/"
(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","."]
这正是我所期待的。但是当这个函数是来自 Scotty 的 运行 时,称为 serveDir "stuff/"
,我得到这个输出:
"static/stuff/"
["..","hello","bye","someDir","."]
[]
["..","."]
这里发生了什么?我知道 ActionM 是 MonadIO 的一个实例,否则无法编译。我有点不知所措。有人可以对此有所了解或提出建议吗?其余代码可根据要求提供,但我可以说我正在使用 wai-middleware-static 来允许静态文件请求,并且其他函数中来自该目录的其他文件请求有效。
fs <- liftIO $ filterM (doesFileExist . ((++) prefix)) entries
不应该是(++) path
吗?
我正在尝试制作一个列出给定目录内容的网页,但我 运行 遇到了一个奇怪的问题:当我 运行 它时,代码会产生所需的输出在 GHCi 中逐行执行,但在 运行ning 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/"
(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","."]
这正是我所期待的。但是当这个函数是来自 Scotty 的 运行 时,称为 serveDir "stuff/"
,我得到这个输出:
"static/stuff/"
["..","hello","bye","someDir","."]
[]
["..","."]
这里发生了什么?我知道 ActionM 是 MonadIO 的一个实例,否则无法编译。我有点不知所措。有人可以对此有所了解或提出建议吗?其余代码可根据要求提供,但我可以说我正在使用 wai-middleware-static 来允许静态文件请求,并且其他函数中来自该目录的其他文件请求有效。
fs <- liftIO $ filterM (doesFileExist . ((++) prefix)) entries
不应该是(++) path
吗?