我的问题是Haskell如何与系统交互。 例如,IO如何发生?
我对IO monad不感兴趣。或者如何使Haskell打印字符串或读取文件。 我对Haskell和底层操作系统之间的层(如果它是如何工作的)感兴趣。 Haskell本身(不是我)如何在控制台上打印任何东西?它是如何与操作系统交互的?
例如,在Python中我可以执行任何系统命令。我可以做到echo message
。
这真正变得非常重要的是了解套接字如何工作,以及如何在我获得新连接时确保我的程序被中断。
在python中,一种方法是使用epoll
,这是操作系统的一部分(我相信只是接管了python进程的控制权)。
编辑:为了更容易理解我在寻找答案中的内容: - 当Haskell中断时,Haskell是否在它的轨道上停止了? - 在我完成处理旧连接之前,有什么保证可以回答新连接吗? - 它是如何获得中断的?
答案 0 :(得分:4)
Haskell没有说明。由GHC实施,我认为有一个IO管理器在后台使用epoll。所有这些都隐藏在一个抽象层之后,所以你不必担心它 - 只是产生一些线程并让它们阻塞你想要读取的任何套接字。另请参阅" How can I watch multiple files/socket to become readable/writable in Haskell?"。
编辑以解决您的第二个问题:不,运行时不应该阻止调用(无论是线程还是非线程运行时)。被阻止的线程被存储起来,运行时切换到准备执行的线程,就像您期望的那样。请注意,您必须使用GHC提供的调用才能生效 - 手动使用FFI可以完全阻止非线程运行时。关于这方面的更多细节总结在this blog post of mine中(跳过特定于gtk的"最佳实践和#34;以及"胆量"部分)。