私は次のサンプルコードを持っています
let x = [return 1::IO(Int), return 2::IO(Int)]
したがって、xはIO(Int)のリストです。maximumは、リスト内のものがOrdsである場合に、リストの最大値を返す関数です。このIO(Int)のリストで実行するように最大を「マップ」するにはどうすればよいですか?
私は次のサンプルコードを持っています
let x = [return 1::IO(Int), return 2::IO(Int)]
したがって、xはIO(Int)のリストです。maximumは、リスト内のものがOrdsである場合に、リストの最大値を返す関数です。このIO(Int)のリストで実行するように最大を「マップ」するにはどうすればよいですか?
ここで重要な点は、IO
アクションを比較することはできず、それらのアクションから生じる値のみを比較できることです。比較を実行するには、これらのアクションを実行して結果のリストを取得する必要があります。幸いなことに、まさにそれを行う関数がありますsequence :: (Monad m) => [m a] -> m [a]
。これは、アクションのリストを取得し、結果のリストを提供するアクションを生成するためにそれらを実行します。
最大値を計算するには、次のようにします。
x = [return 1::IO(Int), return 2::IO(Int)]
...
biggest = maximum `fmap` sequence x :: IO [Int]