【发布时间】:2015-04-27 05:34:20
【问题描述】:
我必须在 haskell 中创建一个 http 服务器。为此,我必须定义一个 acceptFork 函数来处理传入的 TCP 连接,它具有以下类型:
acceptFork :: Socket -> (Handle -> IO ()) -> IO ()
它的工作方式如下:
- 使用accept函数接受传入的连接,该连接返回一个Handle
- 使用 hSetBuffering 函数禁用缓冲(将值设置为 NoBuffering)
- 使用 hSetNewlineMode 函数设置新行字符(使用参数 (NewlineMode CRLF CRLF))
- 启动一个新线程,对句柄值运行输入操作
- 递归地等待下一个连接
到目前为止,我想出的是:
import qualified Network.Socket as NS
acceptFork :: Socket -> (Handle -> IO ()) -> IO ()
acceptFork lsock k = do
(csock,_) <- NS.accept lsock
hSetBuffering lsock NoBuffering
hSetNewlineMode lsock (NewlineMode CRLF CRLF)
forkIO (k csock)
问题是它甚至无法编译。有人可以解释我做错了什么吗?谢谢!
这是我得到的错误:
bead2.hs:31:23:
Couldn't match expected type `(Handle -> BufferMode -> IO ())
-> Socket
-> BufferMode
-> (Handle -> NewlineMode -> IO ())
-> Socket
-> NewlineMode
-> IO (Handle, t0)'
with actual type `IO (Socket, NS.SockAddr)'
The function `NS.accept' is applied to 7 arguments,
but its type `Socket -> IO (Socket, NS.SockAddr)' has only one
In a stmt of a 'do' block:
conn@(csock, _) <- NS.accept
lsock
hSetBuffering
lsock
NoBuffering
hSetNewlineMode
lsock
(NewlineMode CRLF CRLF)
In the expression:
do { conn@(csock, _) <- NS.accept
lsock
hSetBuffering
lsock
NoBuffering
hSetNewlineMode
lsock
(NewlineMode CRLF CRLF);
forkIO (k csock) }
bead2.hs:34:5:
Couldn't match type `ThreadId' with `()'
Expected type: IO ()
Actual type: IO ThreadId
In a stmt of a 'do' block: forkIO (k csock)
In the expression:
do { conn@(csock, _) <- NS.accept
lsock
hSetBuffering
lsock
NoBuffering
hSetNewlineMode
lsock
(NewlineMode CRLF CRLF);
forkIO (k csock) }
【问题讨论】:
-
首先请添加您收到的错误消息 - 谢谢
-
btw:最初的大部分内容来自 indentation 问题,我认为是在您将代码复制并粘贴到 Stack-Overflow 时引入的 - 但它看来您真的打算将其全部达到
acceptFork的水平(我错误地编辑了;))
标签: haskell tcplistener