2011-04-27 76 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