並べ替えたい[(String, [String], IO Int)]
リストがあります。sortBy (\x -> ...) list
IO を使用して の内部値を取得する必要があります。IO Int
つまり、戻ることはできず、関数にOrdering
のみ戻ることができます。リストをソートする方法はありますか?IO Ordering
sortBy
1 に答える
7
各タプルの 3 番目の要素はIO Int
であるため、その値は外界に依存します。したがって、ソートされたリストの順序は外界に依存します。いいえ、 [(String, [String], IO Int)]
の値でソートされたを作成する方法はありませんIO Int
。
できることは、 の値を作成し、関数をIO [(String, [String], Int)]
モナドに持ち上げて、 でソートされたリストを生成する別のモナドを提供することです。これは純粋なリストではありませんが、モナドに他の純粋な関数を挿入して、任意の純粋な計算を行うことができます。sortBy
IO
IO [(String, [String], Int)]
Int
IO
次のようなことができます:
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 に答える