将IO String转换为String

icy*_*per 0 io monads haskell types

我有问题将IO String()转换为String()下面是评估表达式的函数.

foobar :: String -> IO String

eval :: String -> Sh () ()
eval x =  do
 s <- foobar x
 shellPutStrLn $ s
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为eval返回IO String而不是Sh.一些IO在一个函数内完成的那一刻它将它转换/篡改成IO String.如何防止转换或将IO字符串转换为字符串?

Joh*_*n L 6

看起来您的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
Run Code Online (Sandbox Code Playgroud)

有关你可以使用的很多现成monad变换器的信息,请参阅MTL,xmonad是实践中这种风格的一个很好的例子.