[英]Proper refactor of a Haskell code when a non-monadic value becomes a monadic value
[英]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.