1

私は次のサンプルコードを持っています

let x = [return 1::IO(Int), return 2::IO(Int)]

したがって、xはIO(Int)のリストです。maximumは、リスト内のものがOrdsである場合に、リストの最大値を返す関数です。このIO(Int)のリストで実行するように最大を「マップ」するにはどうすればよいですか?

4

2 に答える 2

9

最初sequenceに配列をに配置し、次に:を使用してIO [Int]実行します。maximumliftM

liftM maximum (sequence yourList) :: IO Int
于 2013-01-30T16:12:00.537 に答える
9

ここで重要な点は、IOアクションを比較することはできず、それらのアクションから生じる値のみを比較できることです。比較を実行するには、これらのアクションを実行して結果のリストを取得する必要があります。幸いなことに、まさにそれを行う関数がありますsequence :: (Monad m) => [m a] -> m [a]。これは、アクションのリストを取得し、結果のリストを提供するアクションを生成するためにそれらを実行します。

最大値を計算するには、次のようにします。

x = [return 1::IO(Int), return 2::IO(Int)]
...
biggest = maximum `fmap` sequence x :: IO [Int]
于 2013-01-30T16:14:00.460 に答える