相关疑难解决方法(0)

Haskell懒惰 - 我如何更快地强制IO发生?

我刚开始学习Haskell.下面是一些以强制性风格编写的代码,它实现了一个简单的服务器 - 它打印出HTTP请求头.除了我需要在Haskell中重新思考它,使用惰性列表和更高阶函数之外,我还想清楚地看到它为什么不能按照我的意图行事.它总是一个落后 - 我用一个请求命中它,没有任何反应,再次点击它,它打印第一个请求,第三次点击它,它打印第二个请求,等等.为什么?什么是对此代码的最小更改,会导致它在请求进入时正确打印?

import Network
import System.IO
import Network.HTTP.Headers

acceptLoop :: Socket -> IO ()
acceptLoop s = do
  (handle, hostname, _) <- accept s
  putStrLn ("Accepted connection from " ++ hostname)
  text <- hGetContents handle
  let lns = lines text
      hds = tail lns
  print $ parseHeaders hds
  hClose handle
  acceptLoop s


main :: IO ()
main = do
  s <- listenOn (PortNumber 8080)
  acceptLoop s
Run Code Online (Sandbox Code Playgroud)

谢谢,罗布

跟进

所有的答案都很有帮助.下面的代码可以工作,但不会像建议的那样使用字节串.后续问题:可以ioTakeWhile使用标准库中的某些函数替换,可能在Control.Monad中?

ioTakeWhile :: (a -> Bool) -> …
Run Code Online (Sandbox Code Playgroud)

io haskell lazy-evaluation

14
推荐指数
2
解决办法
3445
查看次数

标签 统计

haskell ×1

io ×1

lazy-evaluation ×1