【问题标题】:Get value from IO String in Haskell [duplicate]从 Haskell 中的 IO 字符串中获取值 [重复]
【发布时间】:2013-11-15 14:07:09
【问题描述】:

我有一个带有签名read_F95_src :: String -> IO [String] 的函数。此功能在别处使用,无法更改。

我正在阅读源代码行并与诸如src_lines = read_F95_src templ_src_name 之类的标签相关联,该标签可以正常编译和运行。

问题是我现在有一个接收[String] 的函数,无论我如何尝试,我都无法找到从src_lines 获取[String] 值的方法。

【问题讨论】:

标签: string haskell functional-programming


【解决方案1】:

您不会从IO 中“提取”值。相反,您使用fmap 将其余的计算提升到IO。所以

read_F95_src :: String -> IO [String]

doSomethingWithStringList :: [String] -> Whatever

fmap doSomethingWithStringList :: IO [String] -> IO Whatever

fmap doSomethingWithStringList . read_F95_src :: String -> IO Whatever

你应该习惯这种模式,因为当你使用 Haskell 时,它会经常发生在你身上。例如,如果您想对IO Whatever 做某事,您将不得不再次使用相同的技巧!

【讨论】:

    【解决方案2】:
    let src_lines = read_F95_src templ_src_name
    (ss::[String]) <- src_lines
    {- do whatever with ss -}
    

    【讨论】:

    • 这给了我这个parse error (possibly incorrect indentation or mismatched brackets)
    【解决方案3】:

    像这样在 do 块中提取[String]

    some_function :: IO [String]
    some_function = do
      dat <- read_F95_src "some data" -- Now the dat will contain the [String]
      -- Now do all your stuffs on dat and return whatever you want to.
      return dat
    

    一旦你提取了函数内部的dat,你可以根据你的逻辑应用其他函数,最后返回你需要的任何东西。

    【讨论】:

    • 请记住,这个函数将再次返回一个IO [String],所以如果你想对列表做一些事情,你需要在阅读之后但在返回之前进行。 dat 是 - 在这个函数内部 - 一个没有 IO[String] 值。
    • 但是dat只是在do的范围内不是吗?我需要在程序后面使用[String]
    • @Geesh_SO 根据您的逻辑创建在[String] 上运行的函数,并在此函数中调用它。这样你也可以区分纯代码和不纯代码。
    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 2019-02-07
    • 2011-10-01
    • 2014-02-10
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多