我有这个工作正常:
forM_ [1..10] $ \x -> myFunc1 x 99 >>= putStrLn . show >> return ()
myFunc1 :: Int -> Int -> IO Bool
myFunc1 .....
我想在输出中添加一个额外的字符串:
forM_ [1..10] $ \x -> myFunc1 x 99 >>= (++) "the result is: " >>= putStrLn . show >> return ()
但那并没有编译。我尝试了不同的变化,但仍然没有成功。你的建议?
答案 0 :(得分:7)
首先要说的是表达式:
(++) "the result is: "
不是IO动作 - 它只是一个纯函数String - >字符串和 这就是为什么你的代码不是类型检查的一个原因。
要将其转换为IO动作,您可以使用return
:
return . ( (++) "the result is: " )
:: String -> IO String
现在您可以将其与>>=
一起使用。
但是,这不是真正的问题所在......
前置"结果是:"在show
之前,您必须将其插入putStrLn
来电:
... >>= putStrLn . (++ "the result is: ") . show
(请注意,由于>> return ()
已经返回(),因此无需putStrLn
。
老实说,使用do-notation要简单得多:
forM_ [1..10] $ \x -> do
s <- myFunc1 x 99
putStrLn $ "the result is: " ++ show s
答案 1 :(得分:1)
您可以使用连接函数组合show
,如下所示:
forM_ [1..10] $ \x -> myFunc1 x 99 >>= putStrLn . ("the result is: " ++) . show >> return ()
答案 2 :(得分:0)
将++
替换为add
add x y = return (x ++ show (y))
forM_ [1..10] $ \x -> myFunc1 x 99 >>= add "the result is: " >>= putStrLn . show >> return ()
原因:++
的返回类型不是IO
类型