Почему это работает в 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?

Другие вопросы по тегам