我可以浏览http://therning.org/magnus/archives/698,同时寻找一些与 Haskell 联网的示例。这可能是一个简单的例子。
虽然我可以将它用作模板并且它可以工作,但我并不完全理解语义以及如何评估代码。我可以看到是懒惰阻止了forever $ do
块被不断评估,但是是什么迫使它被评估呢?
我可以浏览http://therning.org/magnus/archives/698,同时寻找一些与 Haskell 联网的示例。这可能是一个简单的例子。
虽然我可以将它用作模板并且它可以工作,但我并不完全理解语义以及如何评估代码。我可以看到是懒惰阻止了forever $ do
块被不断评估,但是是什么迫使它被评估呢?
懒惰在这里无关。也没有任何东西可以“阻止”主题forever $ do
块。它被无限评估,实际上您可以将其视为while (true)
常见命令式语言的类似物。该服务器的实现围绕accept serv_sock
函数调用展开,程序在该函数调用上等待连接,从而同步阻塞forever
循环执行,直到它接收到连接,执行它应该执行的操作,然后再次循环。
这一切看起来很像一个标准的命令式程序,但不同之处在于,您正在从其他指令中组合指令,而不是告诉计算机如何处理每个表达式。因此,您可以将main
函数定义视为单个复合指令。
触发评估的原因是您为该指令分配了名称main
和类型签名IO ()
(在您的案例中推断出来)。通过这种方式,您告诉 Haskell 编译器将此指令视为程序的入口点,从而在程序启动时从它开始评估。