2

並べ替えたい[(String, [String], IO Int)]リストがあります。sortBy (\x -> ...) listIO を使用して の内部値を取得する必要があります。IO Intつまり、戻ることはできず、関数にOrderingのみ戻ることができます。リストをソートする方法はありますか?IO OrderingsortBy

4

1 に答える 1

7

各タプルの 3 番目の要素はIO Intであるため、その値は外界に依存します。したがって、ソートされたリストの順序は外界に依存します。いいえ、 [(String, [String], IO Int)]の値でソートされたを作成する方法はありませんIO Int

できることは、 の値を作成し、関数IO [(String, [String], Int)]モナドに持ち上げて、 でソートされたリストを生成する別のモナドを提供することです。これは純粋なリストではありませんが、モナドに他の純粋な関数を挿入して、任意の純粋な計算を行うことができます。sortByIOIO [(String, [String], Int)]IntIO

次のようなことができます:

import Control.Applicative
import Data.List

l :: [(String, [String], IO Int)]
l = [("Foo", [], return 2), ("Bar", [], return 1)]

f :: Monad m => (a, b, m c) -> m (a, b, c)
f (x, y, ioz) = ioz >>= \z -> return (x, y, z)

sl = sortBy (\(x, y, z) (x', y', z') -> compare z z') <$> mapM f l

明らかではないかもしれないので、これはIO Int最初にリストに表示された順序でアクションを実行することを言及する必要があります。しかし、それらを並べ替えるには、それらを実行してInt値を取得する必要があり、それらを何らかの順序で実行する必要があります。

于 2013-04-25T01:00:54.373 に答える