我想知道它是如何putStrLn工作的:我可以看到它具有类型,IO ()但是我不知道Haskell如何实际执行编写标准输出的副作用。
main :: IO ()
main = putStrLn "Test"
Run Code Online (Sandbox Code Playgroud)
该程序如何写入标准输出?
眼看基础是
putStrLn s = hPutStrLn stdout s
Run Code Online (Sandbox Code Playgroud)
我遵循了一系列的功能,这些功能最终将我引向了c_write这样的定义:
foreign import capi unsafe "HsBase.h _write"
c_write :: CInt -> Ptr Word8 -> CUInt -> IO CInt
Run Code Online (Sandbox Code Playgroud)
因此,似乎写入标准输出的效果是通过调用本机代码执行的。
从函数到函数的跳转过程中有些停止(箭头?表示左边的函数调用右边的函数):
hPutStr'?writeBlocks?commitBuffer?writeCharBuffer。
然后,writeCharBuffer调用类型类的方法BufferedIO.flushWriteBuffer上stdout。
继续在stdout的类型类的实例为BufferedIO:
flushWriteBuffer?writeBuf'?writeBuf。在设备上writeBuf调用IODevice.write,该RawIO设备也是一个有stdout实例的类型类。write中继到fdwrite。
fdWrite来电writeRawBufferPtr?do_write终于打电话了c_write。
| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |