将Monadic值转换为Non-monadic

时间:2017-01-12 14:22:06

标签: haskell monads yesod

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

现在,我能够使用返回header('Content-Type: application/json'); echo json_encode(array('status' => 'Invoice has not been created', 'message' => " <br/>".$product_alert."&nbsp; &nbsp;<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

1 个答案:

答案 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以上的某个层,因此我们可以使用liftIOIO [FilePath]转换为m [FilePath]其中m是Monad yesod使用的。

getTestHamletR是一个IO函数 - 每行都在IO内工作,您获取的目录内容为IO [FilePath],您基本上将其转换为IO Html