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字符串转换为字符串?
看起来您的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是实践中这种风格的一个很好的例子.