2013-02-13 4 views
0

의 내용은 다음 코드 동안 :Yesod 핸들러, 게시 된 파일

postImportR = do 
    fi <- lookupFiles "file" 
    fc <- lift $ fileSource (fi !! 0) $$ consume 

는 반복하는하지 않는하는 기능에 (적어도 내가 "liftIO $ 인쇄 FC가 있습니다), 오프를 분할 작동하는 것 같다 :

process :: [FileInfo] -> [String] 
process [] = [] 
process (f:r) = do 
    fn <- fileName f 
    fc <- lift $ fileSource f $$ consume 
    ([fn] : (process r)) 

postImportR = do 
    fi <- lookupFiles "file" 
    process fi 

또는 람다 기능 :. 그것은 나에게 이해가 안 유형의 오류를 제공 핸들러에서

files <- L.map (\f -> (fileName f, lift $ fileSource f $$ consume)) fi 

내 잘못은 어디에 있는가? 파일의 라인에서 데이터베이스 가져 오기를위한 콘텐츠를 생성하고 (물론 더 많은 하스켈을 배우기를 좋아한다.

답변

1

당신은

fileName :: FileInfo -> Text 

그래서 당신이 직접 할 필요가 그

fn <- fileName f 

같이 할 - 블록에 fileName을 사용할 수 없습니다 가지고하자 결합

let fn = fileName f 

그 다음은 불가능한 것입니다. process :: [FileInfo] -> [String](1),

fc <- lift $ fileSource f $$ consume 

당신이 누구 MonadMonadIO 인 DO-블록에, 당신은 임의의 IO -actions을 포장 할 수있는 Monad에서 얻을 수없는 너무

fileSource :: FileInfo -> Source (ResourceT IO) ByteString 

, 단지 너는 IO 그 자체에서 빠져 나올 수 없다. 당신이 가질 수있는 어떤

process :: (SomeFiendishConstraint m) => [FileInfo] -> m [Text] 
process [] = return [] 
process (f:r) = do 
    let fn = fileName f 
    lift $ fileSource f $$ consume 
    fs <- process r 
    return (fn : fs) 

또는 더 간결하게,

process = mapM (\f -> lift $ fileSource f $$ consume >> return fileName f) 

다음 (1)unsafePerformIO 없다면

postImportR = do 
    fi <- lookupFiles "file" 
    process fi 

입니다.

+0

고맙습니다. 그것은 훌륭합니다. - 그러나 단계별로 : (1) "<-"와 let-binding의 차이를 알고 있지만, 충분한 결과를 생각할 시간이 없으므로, 당신 말이 맞습니다. (2) 내가 하스켈에게 정말로 새로운 것처럼, 나는 아직도 모나드가 무엇인지, 그리고 그것을 다루는 방법을 충분히 이해하지 못한다. (3) 마지막 두 번째 행은 또 다른 맛의 예이다. * map * 나는 아직 좋은 생각이 없다. 먼 길을 떠났다 ... – user2054578