2017-08-15 58 views
2

我正在開發一個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?如果不是,那麼對我的情況來說,更好的方法是什麼?

+0

你擁有的圖案是'富=在DO {..;如果有的話,那麼foo else。}'。這是你應該抽象成自己的功能的模式。 – user2407038

+0

我不確定我明白...爲什麼你不能用waitfor'?難道你不能把'hunt''寫成'狩獵'idx conn t = waitfor「0300aa0801」conn t $ do {...你的原始狩獵區塊到此爲止......}? –

+0

嗨大衛楊,你的答案適用於我的情況。我可以修改'waitfor'並使用你建議的方式。謝謝:) –

回答

7

您可以使用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 
+0

感謝您的迴應,但仍然不能將幫助功能應用於其他功能,如狩獵'? –

+0

如果你包含'hunt''的代碼,有人可能能夠幫助你找到一個適用於這兩者的幫手。 –

+0

爲什麼你不能在'if'表達式中使用'hunt''? –