我正在開發一個TCP客戶端,從流中獲取指定的類型消息,並且發現我自己使用了大量的表達式。例如:Haskell有'when'和'unless'的組合嗎?
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
?如果不是,那麼對我的情況來說,更好的方法是什麼?
你擁有的圖案是'富=在DO {..;如果有的話,那麼foo else。}'。這是你應該抽象成自己的功能的模式。 – user2407038
我不確定我明白...爲什麼你不能用waitfor'?難道你不能把'hunt''寫成'狩獵'idx conn t = waitfor「0300aa0801」conn t $ do {...你的原始狩獵區塊到此爲止......}? –
嗨大衛楊,你的答案適用於我的情況。我可以修改'waitfor'並使用你建議的方式。謝謝:) –