2016-02-17 2 views
0

Хорошо, предположим, что у меня есть операция IO; loadFile :: FilePath -> ByteString который я обрабатываю с processData :: ByteString -> ProcessedData быть эту операцию довольно expesnive, и я хочу, чтобы использовать эти обработанные данные в двух действиях, как так:Цепочные действия, разделяющие данные в блоке do

main = do 
{ 
    bytes <- loadFile "...."; 
    let data = processData bytes 
    in printf (extractFoo data address1) 
     printf (extractFoo data address2) -- Compiler error  
} 

Я знаю, что могу это сделать, который в принципе не разделяя data между двумя действиями:

main = do 
{ 
    bytes <- loadFile "...."; 
    let data = processData bytes 
    in printf (extractFoo data address1); 
    let data = processData bytes 
    in printf (extractFoo data address2);  
} 

Как делить data как в printf? Я очень новичок в Haskell, и я борюсь с монашей IO. Я пытаюсь понять это, но его медленный процесс до сих пор.

+3

Запустите новый блок 'do' после' in'. – Jubobs

+0

@Jubobs duh ... (facepalm) Спасибо! – InBetween

ответ

5

Просто удалите фигурные скобки и использовать простой let:

main = do 
    bytes <- loadFile "...." 
    let d = processData bytes 
    printf (extractFoo d address1) 
    printf (extractFoo d address2) 

Я переименовал свой data в d поскольку data это ключевое слово в Haskell.

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