2017-01-12 10 views
0

하스켈을 처음 사용합니다. 디렉토리에서 내용을 읽어야합니다 (예 : 디렉토리의 모든 파일 나열). 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 
+0

http://stackoverflow.com/questions/1675366/a-haskell-function-of-type-io-string-string의 가능한 복제본 – jkeuhlen

+2

가능한 [유형의 하스켈 함수 : IO 문자열 -> 문자열] (http://stackoverflow.com/questions/1675366/a-haskell-function-of-type-io-string-string) – jkeuhlen

+0

당신이 보는 오류는'fmap toHtml $ getListOfFiles "/ home/chetan"'유형이 있기 때문입니다 'IO (MarkupM())', blaze-html 라이브러리에서'type Html = MarkupM()'을 사용하기 때문입니다. 그러나,'H.p' 함수는'Html -> Html' 타입을 가지므로'MarkupM()'을 취해서 새로운'MarkupM()'을 반환합니다. 당신은'IO (MarkupM())'을 주므로 컴파일러가 불평합니다. 당신은 당신의 불꽃 코드의 바깥 쪽에서'getListOfFiles'를해야 할 것입니다. – bheklilr

답변

3

내가 잘 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) 

을 나는 getTestHamletRIO 직접 아니라고 생각하지만, IO 이상 일부 계층이다, 그래서 우리는 변환 liftIO를 사용할 수있는 IO [FilePath]m는 모나드 yesod입니다 m [FilePath]에 사용.

getTestHamletRIO 기능입니다 - 모든 라인 내부 IO 작동, 당신은 IO [FilePath]으로 디렉토리 내용을 얻을 당신은 본질적으로 IO Html로 변환.

+0

감사합니다. H.p는 [Html]에서 작동하지 않습니다. 그것은 HTML에서만 작동합니다. 나는 그것을 언급하는 관련 오류가 나타납니다. 어떤 생각을 어떻게 해결할 수 있습니까? –

+0

그것은 당신에 달려 있습니다 - 당신은 파일 목록을 가지고 그것을 html로 변환하고 싶습니다. 'toHtml'함수는 예를 들어 html로 '문자열', 그래서 예. 이 예에서는 문자열을 연결했습니다. 'Data.List'에서'interacalate'를 가져 오십시오. – ondra