2017-01-16 1 views
1

다음과 같은 기능을 구현 중입니다. 사용자가 HTTP 요청을 통해 디렉토리 내용을 요청합니다. 요청시 디렉토리 경로가 전달됩니다. 이에 대한 응답으로 해당 디렉토리 경로에 대한 파일 목록을 포함하는 JSON을 보냅니다. IO 오류 처리가 처리됩니다. 대부분의 부분을 구현했습니다. 하지만 오류가 발생합니다. 오류 :IO로 인해 매개 변수 유형이 잘못되었습니다.

getInfoOfDirR::Handler Value 
getInfoOfDirR = do 
      -- files will have type IO (Either IOException [FilePath]) 
        files <- fmap (getListOfFiles.(Data.Text.unpack).fromJust) $ lookupGetParam "dirpath" 
        getJsonRepForFiles files 

파일 목록을 가져옵니다 기능 :에있는 파일의 JSON 표현을 가져옵니다

-- This eliminates the hidden files from the results 
getListOfFiles::FilePath -> IO (Either IOException [FilePath]) 
getListOfFiles fpath = try (fmap (filter $ not.isHiddenFile) $ FS.getDirectoryContents fpath)::IO (Either IOException [FilePath]) 

기능을 다음과 같이

Couldn't match expected type ‘Either IOException [FilePath]’ 
      with actual type ‘IO (Either IOException [FilePath])’ 
• In the first argument of ‘getJsonRepForFiles’, namely ‘files’ 

코드 조각입니다 디렉토리 :

getJsonRepForFiles::Monad m => (Either IOException [FilePath]) -> m Value 
getJsonRepForFiles (Left e) = returnJson $ "An error occurred" ++ show e 
getJsonRepForFiles (Right files) = returnJson files 

getInfoOfDirR의 유형은 Handler Value 입니다. 하스켈의 Yesod 프레임 워크에서이를 구현 중입니다. 하스켈을 처음 접했습니다. 왜 오류가 발생하는지 이해하고 있습니다. 그러나 나는 그것을 고칠 수 없다. 도와주세요. 미리 감사드립니다.

+0

'liftIO'를 사용했지만 문제가 해결되지 않았습니다 –

답변

2

나는 문제가 getListOfFiles 유형 IO의 값을 반환한다는 생각, 그리고 당신은 Handler (IO _)를 생성하고, 상기 do 블록에 구속력을 fmap 함께 사용하여 단지 Handler 수준을 펼쳤다.

당신처럼 fmap 결과의 두 가지 수준을 보내고 join을 시도 할 수 :

files <- join $ fmap (liftIO. ... 

또는처럼 fmap 응용 프로그램 외부 getListOfFiles 전화를 이동 : 나는 시도 있습니다

files <- liftIO . getListOfFiles =<< (fmap ...) 
+0

응답을 보내 주셔서 감사합니다. 나는 두 가지 방법을 시도했다. 지금이 오류가 발생했습니다 : 'IO'를 'HandlerT HelloWorld IO'와 일치시킬 수 없습니다 예상 유형 : 처리기 HelloWorld IO (IOException [FilePath]) 실제 유형 : IO (IOException [FilePath]) –

+0

@ ChetanYewale 나는'files <- liftIO '가 필요할 것이라고 생각하고있다. getListOfFiles = << (fmap ...)'그런 다음. 죄송합니다.'lookupGetParam'이'IO'의 타입을 반환했다고 가정했습니다. – ryachza

+0

정말 고마워요. 그게 효과가 있었어. 나는 너에게 무언가를 묻고 싶었다. 나는 하스켈을 처음 접했다. 함수형 프로그래밍 스타일을 이해합니다. 또한 Functors와 Applicatives를 이해합니다. 나는 Monads와 다소 불편하다. 제가 할 수있는 실천 문제가 점차적으로 제가이 개념들을 더 잘 이해하도록 도와 줄 것입니까? 저에게 알려주세요 .. 나는 Applicatives/Functors/Monads를 사용하는 작은 문제부터 시작하고 싶습니다. 또한 typesystem을 더 잘 이해하고 내가 게시 한 문제를 피하려고합니다. 당신이 제안 할 수있는 것이 있습니까? –

관련 문제