Haskell是否有"何时"和"除非"的组合?



我正在开发一个TCP客户端,它从流中获取指定的消息,并发现自己使用了很多除非和when表达式。例如:

hunt :: Socket -> ThreadId -> IO ()                               
hunt conn t = do threadDelay 1000000
msg <- recv conn 1024
unless (C.isInfixOf "1b14010102" $ encode msg) $ hunt conn t
when (C.isInfixOf "1b14010102" $ encode msg) $ do
threadDelay 7000000
sendAll conn $ goHunt
msg <- recv conn 1024
threadDelay 3000000
close conn
killThread t

我试图建立一个像这样的帮助程序:

waitfor :: ByteString -> Socket -> t -> (ByteString -> Socket -> t -> IO ()) -> IO ()
waitfor str conn tid f = do 
threadDelay 1000000
msg <- recv conn 1024
let m = C.isInfixOf str msg
unless m $ waitfor str conn tid f
when m $ f msg conn tid

然后我可以重用帮助程序:

main = do
...
tid <- myThreadId
conn <- joinWorld u
waitfor "1b14010102" conn tid hunt.

但是如果我有另一个函数(它需要 3 个参数,不像hunt(

hunt' :: ByteString -> Socket -> ThreadId -> IO ()
hunt' idx conn t = do threadDelay 1000000
msg <- recv conn 1024
unless (C.isInfixOf "0300aa0801" $ encode msg) $ hunt' conn t
when (C.isInfixOf "0300aa0801" $ encode msg) $ do
threadDelay 1000000
sendAll conn $ goHunt' idx
threadDelay 3000000
close conn
killThread t

那么我不能使用waitfor,需要再次使用when/unless。那么,Haskell有when/unless的组合吗?如果没有,那么对于我的情况,有什么更好的方法呢?

你可以用if ... then ... else来做这件事。

例如

waitfor :: ByteString -> Socket -> t -> (ByteString -> Socket -> t -> IO ()) -> IO ()
waitfor str conn tid f = do 
threadDelay 1000000
msg <- recv conn 1024
if C.isInfixOf str msg
then waitfor str conn tid f
else f msg conn tid

最新更新