【发布时间】:2017-01-12 14:22:05
【问题描述】:
我是 Haskell 的新手。 我需要从目录中读取内容(即列出目录中的所有文件)并将其转换为 HTML。 我有一个使用 Yesod 框架的代码库。
现在,我可以使用返回IO [FilePath] 类型的getDirectoryContents 读取目录内容。我希望能够用 HTML 来表示它。
有人可以帮我解决这个问题吗?到目前为止,这是我尝试过的。
我得到的错误是:
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 函数:
getListOfFiles::FilePath -> IO [FilePath]
getListOfFiles fpath = FS.getDirectoryContents fpath
【问题讨论】:
-
您看到的错误是因为
fmap toHtml $ getListOfFiles "/home/chetan"的类型为IO (MarkupM ()),因为 blaze-html 库中的type Html = MarkupM ()。但是,H.p函数的类型为Html -> Html,因此它需要一个MarkupM ()并返回一个新的MarkupM ()。你给它一个IO (MarkupM ()),所以编译器会抱怨。您必须在 blaze 代码之外执行getListOfFiles。