我有一个UDP服务器,它反映了它收到的每个ping消息(我认为这很好用).我是客户端,我想做两件事:
看来,无论是因为UDP的性质还是因为这forkIO件事,我的客户端代码都会过早结束/根本不进行任何计数.
另外,我很惊讶地看到函数tryOnePing返回Int 4的250倍.为什么会这样?
main = withSocketsDo $ do
s <- socket AF_INET Datagram defaultProtocol
hostAddr <- inet_addr host
thread <- forkIO $ receiveMessages s
-- is there any better way to eg to run that in parallel and make sure
-- that sending/receiving are asynchronous?
-- forM_ [0 .. 10000] $ \i -> do
-- sendTo s "ping" (SockAddrInet port hostAddr)
-- actually this would be preferred since I can discard the Int …Run Code Online (Sandbox Code Playgroud) 我想为线程手动创建TChan邮箱,其中进入的消息/网络数据包与来自本地线程的消息收集在同一队列中.
我不确定Haskell的典型方法是什么.如何从插槽写入TChan邮箱?
它会是一个有几个独立队列的邮箱吗?或者在几个邮箱中?
我已经看过epass但还没试过.尽管如此,我想我应该做的事情应该是可能的,我还没有真正详细的想法让我开始.有没有人有类似的代码示例?
我有一个模块,通过调用初始化函数创建并初始化全局环境(定义某些约束,如邻居IP地址等).许多后续函数在调用时应使用这些约束.
虽然原则上我理解读者monad的作用,但我不太确定如何将其应用于我的问题,尤其是.
它如何用于初始化由用户定义并作为数据/参数传递给初始化函数的环境.我的意思是,读者monad必须从某个地方获得构成全局不可变环境的实际值.我希望从初始化函数调用中读取值,如下所示myinitial :: arg1 -> arg1 -> IOString,arg1并arg2通过reader monad(?)成为后续函数可访问的全局不可变数据
我如何将这些环境值用作函数参数,例如recvFrom s arg1,arg1来自我的环境的全局不可变数据.要么if arg2 > arg1 then ... else ...
我当然可以制作一个配置文件,但我觉得配置文件会带来很大的灵活性.
[编辑]我理解问题,但是不应该有额外的"无点类似"方式,以便如果函数签名被定义正确,可以省略全局/环境不可变吗?我怎么会需要重构我的if-then-else来应用它.
我有简单的元组(例如从数据库中读取),因为我不知道元素的数量和内容.例如
(String, Int, Int)或(String, Float, String, Int).
我想编写一个泛型函数,它将采用所有类型的元组并用字符串"NIL"替换所有数据.如果字符串"NIL"已经存在,它应该保持不变.
回到这个例子:
("something", 3, 4.788)应该导致("something", "NIL", "NIL")
("something else", "Hello", "NIL", (4,6)) 应该导致 ("something else", "NIL", "NIL", "NIL")
我显然不知道从哪里开始,因为用已知的元组做这个不会有问题.如果没有Template Haskell,是否有可能达到我想要的结果?
我正在寻找几年前在一篇论文中读到的Haskell STM扩展.我仍然记得,一方面,作者声称已经显着改进了Haskell STM,另一方面他们遇到了他们无法解释的测量中的不一致.我还记得作者很清楚.谁会知道那是什么纸?我找不回来了.
我尝试测试一个cabal包上传到HackageDB.当我在hackage网站上进行测试时,一切顺利,但它呈现给我的输出仅包含内容页面,并且没有进一步指向实际模块文档的链接.
现在,我不知道这是否意味着文档无法构建(cabal haddock运行正常并在我的测试系统上构建正确的html)或者我需要以某种方式手动将html包含到包中或者......可能构建可分配包在cabal中有更多选项?
如果我使用forkIO创建一个线程,我需要提供一个函数来运行并获取一个标识符(threadID).然后,我可以通过例如工作负载,MVAR等与此动物进行通信.但是,据我所知,创建的线程非常有限,并且只能以SIMD方式工作,其中为线程创建提供的功能是指令.我无法更改线程启动时提供的功能.据我所知,这些用户线程最终是由OS映射到OS线程的.
我想知道Haskell线程和OS线程如何进行接口.为什么完全不同的Haskell线程可以映射到同一个OS线程?为什么不需要使用固定指令启动OS线程(因为forkIO需要)?调度程序(?)如何识别可能分发的应用程序中的用户线程?换句话说,为什么操作系统线程如此灵活?
最后,有没有办法从应用程序中转储所选线程的堆?
我想使用camel-redis 设置键/值对。我尝试:
spring-redis://localhost:6379?command=SET&CamelRedis.key=testkey&CamelRedis.value=100
Run Code Online (Sandbox Code Playgroud)
但没有喜悦。我收到错误:
There are 2 parameters that couldn't be set on the endpoint. Check the uri if the parameters are spelt correctly and that they are properties of the endpoint. Unknown parameters=[{key=testkey, value=100}]
Run Code Online (Sandbox Code Playgroud)
尽管有很多关于如何订阅等的示例,但我没有找到关于如何设置键/值对的单个示例。我该怎么做呢?
我有以下功能:
sendq :: Socket -> B.ByteString -> String -> IO PortNumber -> IO ()
sendq s datastring host port = do
hostAddr <- inet_addr host
sendAllTo s datastring (SockAddrInet port hostAddr)
Run Code Online (Sandbox Code Playgroud)
而sendAllTo具有功能签名
sendAllTo :: Socket -> ByteString -> SockAddr -> IO ()
Run Code Online (Sandbox Code Playgroud)
问题是我以前的函数传递了一个IO PortNumber,其中SockAddr只接受一个PortNumber.我试图通过将sendAllTo提升到IO monad来使这两者兼容:
liftM sendAllTo s datastring (SockAddrInet port hostAddr)
Run Code Online (Sandbox Code Playgroud)
但没有快乐.告诉我许多论点.这是liftM的案例吗?我该如何正确应用?