Haskell的putStrLn如何发挥作用?

Mat*_*aun 1 io haskell

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

main :: IO ()
main = putStrLn "Test"
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*aun 6

使用C

眼看基础

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

然后,writeCharBuffer调用类型类的方法BufferedIO.flushWriteBufferstdout

继续在stdout的类型类的实例BufferedIO

flushWriteBufferwriteBuf'writeBuf。在设备上writeBuf调用IODevice.write,该RawIO设备也是一个有stdout实例的类型类。write中继到fdwrite

fdWrite来电writeRawBufferPtrdo_write终于打电话了c_write

  • “ putStrLn”是唯一由* Haskell *定义的东西。在此之下的所有内容(在这种情况下,从hPutStrLn开始)都是GHC的实现细节。 (3认同)