在功能中间输出

w12*_*220 0 haskell

如何在函数中间输出某些内容,但仍返回IO()以外的内容?

f :: Int -> Int
f n = do
    print n
    n + 1
Run Code Online (Sandbox Code Playgroud)

谢谢

ƛƛƛ*_*ƛƛƛ 8

f消耗一个Int; 它会产生IO动作

f n = print n >> return ( n + 1) :: IO Int 
Run Code Online (Sandbox Code Playgroud)


che*_*ner 7

只能用于调试目的,可以使用trace函数。如果您确实想产生输出,请使用IO

import Debug.Trace

f :: Int -> Int
f n = trace (show n) (n + 1)
Run Code Online (Sandbox Code Playgroud)

trace 本质上是一个不纯函数,它将其参数写入标准错误并返回标识函数。

要正确使用IO,请将类型更改为Int -> IO Int

f :: Int -> IO Int
f n = do
    print n
    return (n + 1)
Run Code Online (Sandbox Code Playgroud)

  • @RobinZigmond我也有同样的想法,“这是一个常见问题”,但是很显然,OP在IO()中的IO部分没有问题,但是不喜欢()部分,因为他们想返回一个Int值。 `。因此,`IO Int`是答案。 (2认同)