我想知道putStrLn
的工作方式:我可以看到它的类型为IO ()
,但我不知道Haskell实际如何执行写出标准输出的副作用。
main :: IO ()
main = putStrLn "Test"
该程序如何写入标准输出?
答案 0 :(得分:6)
在base中看到
putStrLn s = hPutStrLn stdout s
我遵循了一系列的功能,这些功能最终将我引向c_write
,其定义如下:
foreign import capi unsafe "HsBase.h _write"
c_write :: CInt -> Ptr Word8 -> CUInt -> IO CInt
因此,似乎写stdout的效果是通过调用本机代码来实现的。
在我的旅程中,从函数到函数的跳转中有些停止(箭头→表示左边的函数调用右边的函数):
hPutStr'
→writeBlocks
→commitBuffer
→writeCharBuffer
。
然后,writeCharBuffer
在stdout
上调用类型类方法BufferedIO.flushWriteBuffer
。
在BufferedIO
中继续stdout
's typeclass instance:
flushWriteBuffer
→writeBuf'
→writeBuf
。 writeBuf
在IODevice.write
设备上调用RawIO
,该设备也是一个instance for stdout的类型类。 write
中继到fdwrite
。
fdWrite
呼叫writeRawBufferPtr
→do_write
,最终呼叫c_write
。