是否可以在haskell中进行一些操作实时输出,然后返回一个字符串,其函数如下:
test :: String -> String
test x = do
putStrLn x
-- make some stuff
return "abc"
答案 0 :(得分:3)
是的。但是,您的函数test
也必须是IO
函数。因此,您必须编写test :: String -> IO String
作为其类型。此外,使用情况也不同。你必须先“解开”这个值:
-- instead of
if (test string == "abc") then ...
-- you have to write
do string' <- test string -- unwrap
if (string' == "abc") then ...
我可以理解,有时需要在纯计算内部的某处打印调试消息。对于此特殊用例,来自trace
的函数Debug.Trace
。它具有类型trace :: String -> a -> a
,它打印出它的第一个参数,然后返回第二个参数。如果您编写一个复杂的程序并想要验证它是否有效,这通常很有用。但要注意:您无法预测邮件何时打印或是否已打印。根据编译器的情绪,它可能会出现两次或根本不出现。