Haskell套接字接收超时

ReF*_*ity 5 sockets haskell timeout

我正在用 haskell 编写 Windows 的 SNTP 客户端。这是抛出 的代码片段Exception: mallocPlainForeignPtrBytes: size must be >= 0,即recv函数执行的操作:

getResponse :: HostName -> IO (Maybe String)
getResponse server = withSocketsDo $ do
    s <- socket AF_INET Datagram defaultProtocol
    setRecvTimeout s waitingTime
    host <- getHostByName server
    let hostAddress = head $ hostAddresses $ host
    connect s (SockAddrInet sntpPort hostAddress)
    sendAll s requestPacket
    response <- timeout (-1) (recv s 1024)
    return $ BC.unpack <$> response 
Run Code Online (Sandbox Code Playgroud)

主要问题是并timeout不能真正防止套接字阻塞。也setSocketOption对我不起作用并且setRecvTimeout有效,但recv在连接到无效服务器时抛出异常。那么如何recv正确超时呢?

我不想用 try-catch 处理这个异常,因为它并不是真正的函数式方法,而且我确信一定有更简单和优雅的方法来做到这一点。