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 作者创建了一个拉取请求,其中包含一个在库中修复此问题的补丁。在被接受之前,您可以从我的fork中拉出,并使用cabal install为您完成这项工作。

于 2013-01-02T13:54:27.437 回答