하스켈을 처음 사용합니다. 디렉토리에서 내용을 읽어야합니다 (예 : 디렉토리의 모든 파일 나열). HTML로 변환해야합니다. 나는 Yesod 프레임 워크를 사용하는 코드베이스를 가지고 있습니다.모나드 값을 모나드가 아닌 값으로 변환
getDirectoryContents
을 사용하여 디렉토리 내용을 읽을 수 있었으며 그 유형은 IO [FilePath]
입니다. 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
기능입니다 : Couldn't match type ‘IO’ with ‘Text.Blaze.Internal.MarkupM’ Expected type: Text.Blaze.Internal.MarkupM Html Actual type: IO Html
아래의 코드를 확인하시기 바랍니다
getListOfFiles::FilePath -> IO [FilePath]
getListOfFiles fpath = FS.getDirectoryContents fpath
http://stackoverflow.com/questions/1675366/a-haskell-function-of-type-io-string-string의 가능한 복제본 – jkeuhlen
가능한 [유형의 하스켈 함수 : IO 문자열 -> 문자열] (http://stackoverflow.com/questions/1675366/a-haskell-function-of-type-io-string-string) – jkeuhlen
당신이 보는 오류는'fmap toHtml $ getListOfFiles "/ home/chetan"'유형이 있기 때문입니다 'IO (MarkupM())', blaze-html 라이브러리에서'type Html = MarkupM()'을 사용하기 때문입니다. 그러나,'H.p' 함수는'Html -> Html' 타입을 가지므로'MarkupM()'을 취해서 새로운'MarkupM()'을 반환합니다. 당신은'IO (MarkupM())'을 주므로 컴파일러가 불평합니다. 당신은 당신의 불꽃 코드의 바깥 쪽에서'getListOfFiles'를해야 할 것입니다. – bheklilr