2016-04-23 10 views
0

intのセットからランダムな要素を1つ取る必要があります。私は、関数elemAt :: Int->Set a->aを使用しようとしていますが、ランダムにはelemAtの最初の引数で使用されるIntを生成する必要がありますが、randomRIOはモナド関数なので問題があります。どのように私はintを返しfuncionでrandomRIOを使用することができます例:?Haskellで乱数セットHaskell

element set = elemAt (function (size set)) set 
+1

短い答えだ* 'unsafePerformIOを使用して*浮気せず') - ちょうど正直で、' IO Int'を返します(明らかに 'function'は純粋ではないので、Haskellはあなたにこの関数を書いてもらいたくないと思っています) – Carsten

+0

構文も' < - ' - これはちょうど' function i = randomRIO(0、i-1) ' – Carsten

答えて

1

私達は私達の機能があるかどうかを知りたい:

function :: Int->Int 
function i = x <- randomRIO(0,i-1) 

私は何をしようとしていることは、このようなものです純粋な - あなたは明らかに純粋ではない関数を実装したいと思う - それは無作為です。

この関数については正直で、型にこれを示してください。今度はrandomRIOを使用できます。この場合は、IO-計算を返して指定します。あなたはランダムな要素を取りたいと仮定すると、

Data.Setを形成し、それは次のようになりますよ:Mapのため

randomElement :: Set a -> IO a 
randomElement set = do 
    i <- randomRIO (0, size set - 1) 
    return $ set `elemAt` i 

を、などそれは(あなたがすることはできません似た

+0

ですが、このように私はモナドのfunctiで要素を使うことができますに。私はランダムな要素を削除するために使用できる他の方法はありますか? –

+0

正確にはそうではありません - ランダムジェネレータを渡すときに 'IO'は必要ありません。特別なモナドがありますが、最後にあなたはこの情報/タイプを取らなければなりません。 – Carsten

+0

私はこれを使用していますforAllの第2引数は関数:: a-> propです。モナドはこれに合う? –