0

我可以浏览http://therning.org/magnus/archives/698,同时寻找一些与 Haskell 联网的示例。这可能是一个简单的例子。

虽然我可以将它用作模板并且它可以工作,但我并不完全理解语义以及如何评估代码。我可以看到是懒惰阻止了forever $ do块被不断评估,但是是什么迫使它被评估呢?

4

1 回答 1

1

懒惰在这里无关。也没有任何东西可以“阻止”主题forever $ do块。它被无限评估,实际上您可以将其视为while (true)常见命令式语言的类似物。该服务器的实现围绕accept serv_sock函数调用展开,程序在该函数调用上等待连接,从而同步阻塞forever循环执行,直到它接收到连接,执行它应该执行的操作,然后再次循环。

这一切看起来很像一个标准的命令式程序,但不同之处在于,您正在从其他指令中组合指令,而不是告诉计算机如何处理每个表达式。因此,您可以将main函数定义视为单个复合指令。

触发评估的原因是您为该指令分配了名称main和类型签名IO ()(在您的案例中推断出来)。通过这种方式,您告诉 Haskell 编译器将此指令视为程序的入口点,从而在程序启动时从它开始评估。

于 2013-03-31T18:41:56.880 回答