1

シーケンスからランダムな要素を抽出しようとしています。私が定義しようとしている関数は以下のとおりです。

getRandomInts :: Seq Int -> PureMT -> ((Seq Int, Int), PureMT)
getRandomInts ints gen = sampleState (fromJust $ choiceExtractSeq ints) gen

これは私が得るエラーです:

Overlapping instances for Data.Random.Lift.Lift
      transformers-0.3.0.0:Data.Functor.Identity.Identity
      (StateT PureMT transformers-0.3.0.0:Data.Functor.Identity.Identity)
  arising from a use of `sampleState'
Matching instances:
  instance [incoherent] (Monad m, MonadTrans t) =>
                        Data.Random.Lift.Lift m (t m)
    -- Defined in `Data.Random.Lift'
  instance [incoherent] Monad m =>
                        Data.Random.Lift.Lift
                          transformers-0.3.0.0:Data.Functor.Identity.Identity m
    -- Defined in `Data.Random.Lift'
In the expression:
  sampleState (fromJust $ choiceExtractSeq ints) gen
In an equation for `getRandomInt':
    getRandomInt ints gen
      = sampleState (fromJust $ choiceExtractSeq ints) gen

これを修正する方法を知っている人はいますか、またはシーケンスからランダムな要素を (置換なしで) 効率的に取得する方法を提案していますか?

4

1 に答える 1

1

私はこのプログラムで同様の問題を抱えていました:

sampleState (uniform (1 :: Int) 100 :: RVar Int) (mkStdGen 1)

これにより、ほぼ同じエラー メッセージが表示されます。ここでの問題は、 に重複するインスタンスData.Random.Liftがあることですが、最も具体的なインスタンスがないため、ghc はプログラムを拒否します (ユーザー ガイドに記載されています)。

これを修正した方法は、他のインスタンスよりも具体的なインスタンスを提供することだったので、次のインスタンスを削除するだけで、すべてが正常にコンパイルされます (完全な言語プラグマとインポートを含めました)。

{-# LANGUAGE OverlappingInstances, 
             IncoherentInstances, 
             FlexibleInstances, 
             MultiParamTypeClasses #-}

import Data.Random
import Data.Random.Distribution.Uniform
import System.Random

import Data.Random.Lift
import Data.Functor.Identity
import Control.Monad.Trans.Class as T

main = print test

test :: (Int, StdGen)
test = sampleState (uniform (1 :: Int) 100 :: RVar Int) (mkStdGen 1)

instance MonadTrans t => Lift Identity (t Identity) where
  lift = T.lift

つまり、 のより具体的なインスタンスを作成して、コンパイラをガイドしてみてくださいData.Random.Lift.Lift

アップデート

ライブラリでこれを修正するパッチを使用して、random-fu の作成者にプル リクエストを作成しました。それが受け入れられるまで、あなたは私のforkcabal installから引っ張って、これをあなたのために働かせるために使うことができます.

于 2013-01-02T13:54:27.437 に答える