我怎麼能Haskell的IO列表轉換爲正常的名單?
IO [value] -> [value]
是否有任何內置的函數來做到這一點?
我怎麼能Haskell的IO列表轉換爲正常的名單?
IO [value] -> [value]
是否有任何內置的函數來做到這一點?
有些方法可以做你所要求的,但它是不安全的。因此,我認爲你應該反過來看待這個問題。在清單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
爲什麼[sequence](https://hackage.haskell.org/package/base-4.8.0.0/docs/Prelude.html#v:sequence)不安全? (這是一個真正的問題) – 2015-06-18 06:11:20
@AntoineCatton序列不是不安全的,注意它的類型是(當使用'IO' monad)'[IO a] - > IO [a]'時。問題的要求是'IO [a] - > [a]'類型,你可以用'unsafePerformIO'來完成。但是,如果'IO'手術有任何副作用,結果將是不可預測的。 – HaskellElephant 2015-06-18 10:42:57
你是如何學習Haskell的?沒有辦法逃脫monad(muhaha!)。但是,只要您在最後返回一個IO值,您可以用''''以'do'表示法將其打包,將其提供給純函數並執行其他所有操作。 – delnan 2011-04-27 10:06:01
你不能沒有做真正骯髒的事情。這個問題似乎每週都會出現,例如http://stackoverflow.com/questions/5090779/haskell-problem-io-string-int – Landei 2011-04-27 10:07:43
如果這樣的功能存在,你可以使用它來崩潰你的程序。 Haskell的語義應該防止這種情況,這就是爲什麼所有這些函數都被標記爲「不安全」的原因。 – 2011-04-27 10:37:28