A Tour of Go in Haskell

GitHub Language
Select

Go の select に直接相当するものは Haskell にはありませんが、必要であれば簡単に用意することができます。

Go の select は複数の送信・受信命令のうち、どれか実行可能なものを1つ実行します。stm パッケージの orElse :: STM a -> STM a -> STM a 関数は2つの STM 命令のうち実行できるものを実行します。 Haskell で2引数関数をリストに拡張するには fold 系の関数を使えば簡単にできます。 この実装の注意点として、複数の命令が実行可能な場合は Go のようにランダムセレクトされるのではなく、 リストの先頭に近いものが優先されます。 また、リスト中の STM 命令の戻り値の型はすべて同じである必要があります。

実は STM 型は MonadPlus クラスのインスタンスなので select は以下のように書くこともできます。

// another implimentation of select
import Control.Monad (msum)
select = atomically . msum

STM 型の MonadPlus の実装が orElse で書かれているのでこの書き方ができます。 ただし MonadPlus の実装が orElse であることはドキュメントに明示的に書かれているわけではないので、 この書き方は注意が必要かも知れません。

< 5 / 11 >