Почему это работает в GHCi, а не в Скотти?
Я пытаюсь создать веб-страницу, которая будет перечислять содержимое данного каталога, но я сталкиваюсь со странной проблемой: код выдает желаемый результат, когда я запускаю его построчно в GHCi, но когда он выполняется в работающем Экземпляр Скотти, он производит другой (неправильный) вывод. Вот соответствующая часть кода:
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","."]
чего я и ожидаю Но когда эта функция запускается из Скотти, называется serveDir "stuff/"
Я получаю этот вывод:
"static/stuff/"
["..","hello","bye","someDir","."]
[]
["..","."]
Что здесь происходит? Я знаю, что ActionM является экземпляром MonadIO, иначе это не скомпилируется. Я немного растерялся. Может кто-нибудь пролить свет на это или посоветовать? Остальная часть кода доступна по запросу, но я могу сказать, что я использую wai-middleware-static, чтобы разрешить статические запросы файлов, и другие запросы файлов из этого каталога в других функциях работают.
1 ответ
fs <- liftIO $ filterM (doesFileExist . ((++) prefix)) entries
Разве этого не должно быть (++) path
?