2011-04-27 45 views
1

可能重複:
haskell-problem: io string -> [int]轉換Haskell的IO表列出類型

我怎麼能Haskell的IO列表轉換爲正常的名單?

IO [value] -> [value] 

是否有任何內置的函數來做到這一點?

+5

你是如何學習Haskell的?沒有辦法逃脫monad(muhaha!)。但是,只要您在最後返回一個IO值,您可以用''''以'do'表示法將其打包,將其提供給純函數並執行其他所有操作。 – delnan 2011-04-27 10:06:01

+0

你不能沒有做真正骯髒的事情。這個問題似乎每週都會出現,例如http://stackoverflow.com/questions/5090779/haskell-problem-io-string-int – Landei 2011-04-27 10:07:43

+0

如果這樣的功能存在,你可以使用它來崩潰你的程序。 Haskell的語義應該防止這種情況,這就是爲什麼所有這些函數都被標記爲「不安全」的原因。 – 2011-04-27 10:37:28

回答

9

有些方法可以做你所要求的,但它是不安全的。因此,我認爲你應該反過來看待這個問題。在清單IO中,您應該將純粹的功能提升到IO

比方說,你想從數據庫列表和應用一些純函數,那麼你可以做到以下幾點:

yourFunc = do 
    list <- getListFromDB 
    return (myPureFunction List) 

,或者如果你想打印結果後記:

yourFunc = do 
    list <- getListFromDB 
    print (myPureFunction List) 

一般來說,爲了計算IO單子內純 結果,你可以使用讓:

yourFunc = do 
    list <- getListFromDB 
    let result = myPureFunction list 
    return result 

或更緊湊:

import Control.Monad((=<<)) 
import Control.Applicative((<$>)) 

yourFunc = print =<< myPureFunction <$> getListFromDB 
+0

爲什麼[sequence](https://hackage.haskell.org/package/base-4.8.0.0/docs/Prelude.html#v:sequence)不安全? (這是一個真正的問題) – 2015-06-18 06:11:20

+1

@AntoineCatton序列不是不安全的,注意它的類型是(當使用'IO' monad)'[IO a] - > IO [a]'時。問題的要求是'IO [a] - > [a]'類型,你可以用'unsafePerformIO'來完成。但是,如果'IO'手術有任何副作用,結果將是不可預測的。 – HaskellElephant 2015-06-18 10:42:57