可以用do notation做一些输出然后在haskell中返回一个String吗?

时间:2011-04-24 10:17:54

标签: haskell io monads

是否可以在haskell中进行一些操作实时输出,然后返回一个字符串,其函数如下:

test :: String -> String
test x = do
    putStrLn x
    -- make some stuff
    return "abc"

1 个答案:

答案 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,它打印出它的第一个参数,然后返回第二个参数。如果您编写一个复杂的程序并想要验证它是否有效,这通常很有用。但要注意:您无法预测邮件何时打印或是否已打印。根据编译器的情绪,它可能会出现两次或根本不出现。