Haskell的putStrLn如何发挥作用?

时间:2019-05-13 17:51:49

标签: haskell io

我想知道putStrLn的工作方式:我可以看到它的类型为IO (),但我不知道Haskell实际如何执行写出标准输出的副作用。

main :: IO ()
main = putStrLn "Test"

该程序如何写入标准输出?

1 个答案:

答案 0 :(得分:6)

使用C

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'writeBlockscommitBufferwriteCharBuffer

然后,writeCharBufferstdout上调用类型类方法BufferedIO.flushWriteBuffer

BufferedIO中继续stdout's typeclass instance

flushWriteBufferwriteBuf'writeBufwriteBufIODevice.write设备上调用RawIO,该设备也是一个instance for stdout的类型类。 write中继到fdwrite

fdWrite呼叫writeRawBufferPtrdo_write,最终呼叫c_write