繁体   English   中英

将Monadic值转换为Non-monadic

[英]Convert a Monadic value to Non-monadic

我是Haskell的新手。 我需要从目录中读取内容(即列出目录中的所有文件)并将其转换为HTML。 我有一个使用Yesod框架的代码库。

现在,我可以使用getDirectoryContents读取目录内容,该目录返回IO [FilePath]类型。 我希望能够用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

我不太熟悉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是单子耶索德使用。

getTestHamletR是一个IO函数-每行都在IO内部运行,您将目录内容作为IO [FilePath] ,并将其本质上转换为IO Html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM