我正在开发一个 TCP 客户端,它从流中获取指定种类的消息,并且发现我自己使用了很多 unless 和 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
关于haskell - Haskell 是否有 `when` 和 `unless` 的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45696542/