向">> ="添加额外的步骤

时间:2016-08-27 14:18:16

标签: haskell

我有这个工作正常:

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 ()

但那并没有编译。我尝试了不同的变化,但仍然没有成功。你的建议?

3 个答案:

答案 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类型