【问题标题】:transforming IO String to String将 IO 字符串转换为字符串
【发布时间】:2011-08-22 08:12:18
【问题描述】:

我在将 IO String() 转换为 String() 时遇到问题 下面是评估表达式的函数。

foobar :: String -> IO String

eval :: String -> Sh () ()
eval x =  do
 s <- foobar x
 shellPutStrLn $ s

这不起作用,因为 eval 返回 IO String 而不是 Sh。这 在某个函数内完成一些 IO 并将其转换/污染为 IO 字符串。 如何防止转换或将 IO 字符串转换为字符串?

【问题讨论】:

  • IO String() 是什么意思?如果您的意思是IO String (),那不是有效类型,String() 也不是。
  • 您是否正在尝试做类似于donsbot.wordpress.com/2010/08/17/practical-haskell 的事情?
  • 重复Converting IO Int to Intstackoverflow.com/questions/1675366/… 以及其他一百个类似问题。请使用搜索
  • @Landei - 标题相似,但问题的上下文不同,解决方案也不同。我认为您链接到的任何一个问题都不适合作为重复项。虽然这可能是一个单子变压器问题的重复......
  • 在 Math.SE 上,他们有一种叫做“抽象重复”的东西,用于这种几乎但不完全的重复。

标签: haskell types io monads


【解决方案1】:

看起来您的 Sh 类型应该能够执行 IO。实现这一点的常用方法是使用 monad 转换器。那么你会有:

instance MonadIO Sh where -- definition elided because you don't show Sh

shellPutStrLn :: String -> Sh ()
shellPutStrLn = liftIO . putStrLn

eval :: String -> Sh ()
eval x = do
  s <- liftIO $ foobar x
  shellPutStrLn s

请参阅MTL 了解许多可以使用的现成 monad 转换器,xmonad 了解这种风格在实践中的一个很好的例子。

【讨论】:

  • 很高兴听到这个消息。如果它解决了你的问题,你会考虑接受这个答案吗?
【解决方案2】:

你的字符串的这种“污染”是故意的,如果不求助于肮脏的黑客是无法避免的。但是,您可以暂时提取String,但前提是您在完成后将结果放回IO。例如

foobar :: String -> IO String

baz :: String -> IO Int
baz str = do
    result <- foobar str
    return (length result)

我建议阅读 Haskell IO

【讨论】:

    【解决方案3】:

    您可以说您在任何时候使用“do notation”时都在某个 monad 中进行操作。例如,下面的代码在 IO monad 中运行:

    printThem x y = do
        print ("x: " ++ show x)
        print ("y: " ++ show y)
    

    你不能在同一个 'do' 块中混合 monad。这就是你在这里尝试的。

    eval :: String -> Sh () ()
    eval x =  do          -- Which monad? There can be only one!
        s <- foobar x     -- IO monad
        shellPutStrLn $ s -- Sh monad
    

    您必须在外层执行foobar。使用类似下面的东西。我不知道你的Sh monad 是从哪里来的,所以我就假装有一个runShell :: Sh () -&gt; IO () 函数:

    doSomeIO :: IO ()
    doSomeIO = do
        s <- foobar x
        runShell $ shellPutStrLn s
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 2019-10-10
      • 2019-01-05
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      相关资源
      最近更新 更多