2013-02-13 3 views
0

в то время как следующий код:Йесод обработчиков, содержание публикуемых файлов

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

, кажется, работает (по крайней мере, я могу «liftIO $ печати к), разделив его на функцию для итерации не:

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 

в обработчике он дает мне ошибку типа я не понимаю

Где моя ошибка - понравилось генерировать контент для импорта базы данных из строк файла (и, конечно же, изучить еще Haskell).

ответ

1

Вы

fileName :: FileInfo -> Text 

так что вы не можете напрямую использовать fileName в сделай блок, как

fn <- fileName f 

Это необходимо будет подведенный связывания

let fn = fileName f 

Следующее, что делает process :: [FileInfo] -> [String] невозможно (1),

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

так с

fc <- lift $ fileSource f $$ consume 

вы в сделай блок которого Monad является MonadIO, и вы не можете выйти из Monad, который может обернуть произвольные IO -действий, просто как вы не можете выбраться из 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) 

, а затем

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

(1) Запрещая unsafePerformIO.

+0

Большое спасибо! Это здорово - но шаг за шагом: (1) Я знаю разницу между «<-» и let-binding, но не нашел времени, чтобы думать о последствиях, вы правы. (2) Поскольку я действительно новичок в Haskell, я все еще недостаточно понимаю, что такое Monads и как с этим бороться, и (3) ваша вторая последняя строка снова является примером одного из разных вкусов * map * У меня до сих пор нет хорошего представления. Кажется, долгий путь ушел ... – user2054578

Смежные вопросы