我是Haskell的新手。 我需要从目录中读取内容(即列出目录中的所有文件)并将其转换为HTML。 我有一个使用Yesod框架的代码库。
现在,我能够使用返回header('Content-Type: application/json');
echo json_encode(array('status' => 'Invoice has not been created', 'message' =>
" <br/>".$product_alert." <a href='$previous'>Back</a>
;
类型的getDirectoryContents
来读取目录内容。我希望能够用HTML表示这一点。
有人可以帮我这个吗?到目前为止,这是我尝试过的。
我得到的错误是:
IO [FilePath]
请检查以下代码:
Couldn't match type ‘IO’ with ‘Text.Blaze.Internal.MarkupM’
Expected type: Text.Blaze.Internal.MarkupM Html
Actual type: IO Html
以下是{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Yesod.Core
import Text.Blaze.Html (toValue, (!))
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as HA
import System.Directory as FS
getTestHamletR = defaultLayout $ do
setTitle "Test Hamlet"
toWidget $ \render -> do
H.p $ do
result <- fmap toHtml $ getListOfFiles "/home/chetan"
result
功能:
getListOfFiles
答案 0 :(得分:3)
我对Yesod并不精通,但这应该有用。
您无法将IO
值转换为非IO值。但是,您可以在IO
期间使用这些值。要说它有些不正确,您可以在IO内部使用这些值。即这应该工作(未经测试):
getTestHamletR = do
files <- liftIO $ getListOfFiles "/home/chtan"
defaultLayout $ do
setTitle "Test Hamlet"
toWidget $ \render -> do
H.p $ toHtml (intercalate ", " files)
我猜getTestHamletR
不是直接IO
,而是IO
以上的某个层,因此我们可以使用liftIO
将IO [FilePath]
转换为m [FilePath]
其中m
是Monad yesod使用的。
getTestHamletR
是一个IO
函数 - 每行都在IO
内工作,您获取的目录内容为IO [FilePath]
,您基本上将其转换为IO Html