簡體   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