[英]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.