3

IOHaskellでブロッキングアクションをどのように処理しますか? IOこのアクションをスコープ内に配置し、別のメソッドからこのスコープを管理するにはどうすればよいですか? タイムアウトに達した場合は、このメソッドを再度呼び出します。abort通常、他の言語では、設定可能な時間内に結果が得られない場合は、おそらくこれを別のスレッドに入れます。(タイマーは外付けです。)

私の場合: いくつかあり、タイムアウトでアクションretriesを実行したいとしましょう。数が0 より大きい場合にのみ、タイムアウトの有効期限が切れた後にアクションが呼び出されるように、タイムアウト スコープにアクションIOを配置するにはどうすればよいですか。IOretries

基本的に: (私はまだ Haskell のソケット ライブラリを調べていません) のIOようなアクションを考えると、それがブラック ボックスであると仮定します。ioMethod::IO String

module Retry where

import IOExternal(ioMethod)

retryFunc :: Int -> IO String
retryFunc retries=do
            msg<-retry 5 100 IOExternal 
            return msg

retry :: Int -> Int -> IOExternal -> IO String
retry retries timeout ioMethod = go retries timeout "" where
        go 0       timeout ioMethod  msg =
                    if msg=="" then return "Max Retries reached" 
                               else return msg

        go retries timeout ioMethod  msg counter
               = gogo retries timeout counter msg  where
                     gogo retries timeout 0 msg = return ""
                     gogo retries timeout counter msg
                        = ioMethod>>=gogo retries timeout counter-1 

この最後の条件/行をモデル化する方法がわかりません。

PS私はまだHaskellでのスレッド化に慣れていません(ここでは初心者です)。タイムアウトされたスコープは別のスレッドで実行する必要があると思います。何らかの方法でメインプログラムからそれをチェックし、それを思い出す必要があります(再試行の場合> 0) またはメイン メソッドを終了します。

4

1 に答える 1