【问题标题】:Convert a Monadic value to Non-monadic将 Monadic 值转换为 Non-monadic
【发布时间】: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 -&gt; Html,因此它需要一个 MarkupM () 并返回一个新的 MarkupM ()。你给它一个IO (MarkupM ()),所以编译器会抱怨。您必须在 blaze 代码之外执行 getListOfFiles

标签: haskell monads yesod


【解决方案1】:

我不太熟悉 Yesod,但这应该可以。

您无法将 IO 值转换为非 IO 值。但是,您可以使用这些值,同时保持IO。说得有些不正确,您可以在 IO 中使用这些值。 IE。这应该可以工作(未经测试):

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是的使用。

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

【讨论】:

  • 谢谢。 H.p 不适用于 [Html]。它仅适用于 Html。我收到提到它的相关错误。知道如何解决它
  • 这取决于你 - 你有一个文件列表并且想要将其转换为 html。函数toHtml 转换例如String 到 html,例如在此示例中,我将字符串连接在一起。从Data.List 导入interacalate
猜你喜欢
  • 1970-01-01
  • 2013-04-22
  • 2012-07-05
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多