【问题标题】:Convert Haskell IO list to list type [duplicate]将 Haskell IO 列表转换为列表类型
【发布时间】:2011-04-27 10:01:23
【问题描述】:

可能重复:
haskell-problem: io string -> [int]

如何将 Haskell IO 列表转换为普通列表?

IO [value] -> [value]

有没有内置函数可以做到这一点?

【问题讨论】:

  • 你是如何学习 Haskell 的?没有办法逃脱单子(muhaha!)。但是,您可以使用 do 表示法中的 <- 将其解包,将其提供给纯函数并使用它执行其他所有操作,只要您在最后返回一个 IO 值。
  • 你不能不做真正肮脏的事情。这个问题似乎每周左右都会出现,例如stackoverflow.com/questions/5090779/…
  • 如果存在这样的功能,您可以使用它来使您的程序崩溃。 Haskell 的语义应该防止这种情况发生,这就是为什么所有这些函数都被标记为“不安全”的原因。
  • 你可以,但这几乎可以肯定是解决潜在问题的错误方法。你的根本问题是什么?为什么要IO [value] -> [value]
  • 123Ex,您应该添加刚刚提供给问题的额外信息。您可以编辑您的问题并执行此操作,甚至可以添加一些代码 sn-ps。

标签: haskell


【解决方案1】:

有很多方法可以按照您的要求进行操作,但这是不安全的。因此,我认为您应该反过来看待问题。不要将列表从IO 中取出,您应该将纯函数提升到IO

假设您想从数据库中获取列表并对其应用一些纯函数,那么您可以执行以下操作:

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

或者如果你想在后面打印结果:

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

一般来说,为了计算一个纯 IO monad 中的结果可以使用 let:

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

或更紧凑:

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

yourFunc = print =<< myPureFunction <$> getListFromDB

【讨论】:

  • 为什么sequence 不安全? (这是一个真正的问题)
  • @AntoineCatton 序列不是不安全的,注意它的类型是(当使用IO monad 时)[IO a] -&gt; IO [a]。问题要问的是IO [a] -&gt; [a] 类型的东西,你可以用unsafePerformIO 来做。但是,如果IO 操作有任何副作用,结果将是不可预测的。
猜你喜欢
  • 2020-06-11
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多