可以用 do 表示法进行一些输出,然后在 haskell 中返回一个字符串吗?

发布于 2024-11-03 05:58:00 字数 168 浏览 5 评论 0原文

在haskell中是否可以使某些操作实时输出,然后返回一个具有如下函数的字符串:

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

is it possible in haskell, to make some operations live output and then return a string with a function like:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你丑哭了我 2024-11-10 05:58:00

是的。但是,您的函数 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 ...

我可以理解,有时需要在纯计算深处的某个地方打印调试消息。对于这个特殊的用例,有来自 Debug.Tracetrace 函数。它的类型为 trace :: String ->一个-> a,它打印出第一个参数,然后返回第二个参数。如果您编写一个复杂的程序并想验证它是否有效,这通常很有用。但请注意:您无法预测何时打印消息或是否打印消息。它可能出现一次两次或根本不出现,具体取决于编译器的心情。

Yes it is. But then, your function test must be an IO function too. So you have to write test :: String -> IO String as it's type instead. Also, the usage is different then. You have to „Unwrap“ the value first:

 -- instead of
 if (test string == "abc") then ...
 -- you have to write
 do string' <- test string -- unwrap
    if (string' == "abc") then ...

I can understand, that there is sometimes the need to print a debug message somewhere deep inside a pure computation. For this special usecase, there is the function trace from Debug.Trace. It has the type trace :: String -> a -> a, it prints out it's first argument and then returns it second. This is often useful, if you write a complicated program and want to verify it works. But beware: You cannot predict when the message is printed or whether it is printed. It may appear once twice or not at all, depending on the compilers mood.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文