IO
Haskellでブロッキングアクションをどのように処理しますか? IO
このアクションをスコープ内に配置し、別のメソッドからこのスコープを管理するにはどうすればよいですか? タイムアウトに達した場合は、このメソッドを再度呼び出します。abort
通常、他の言語では、設定可能な時間内に結果が得られない場合は、おそらくこれを別のスレッドに入れます。(タイマーは外付けです。)
私の場合: いくつかあり、タイムアウトでアクションretries
を実行したいとしましょう。数が0 より大きい場合にのみ、タイムアウトの有効期限が切れた後にアクションが呼び出されるように、タイムアウト スコープにアクションIO
を配置するにはどうすればよいですか。IO
retries
基本的に: (私はまだ 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) またはメイン メソッドを終了します。