所以在我的项目中,我有一个常量函数,它返回一个数组:
import System.Random
giveList :: [Int]
giveList = [8,9,4,5,2]
我想从该列表中随机选择一个元素,如下所示:
seed::Int
seed = 40
generator = mkStdGen seed
giveRandomElement :: Int
giveRandomElement = giveList !! rand where
n = length tetrominoes
(rand,generator) = randomR (0,(n-1)) generator
但是,由于生成器,它不能编译,我想将生成器保留为全局变量,这样就不必继续将其提供给函数。我也不想处理IO包装器,那么我该怎么做呢?
谢谢你的帮助:-)
工作代码示例
import System.Random
seed::Int
seed = 40
giveList :: [Int]
giveList = [8,9,4,5,2]
generator = mkStdGen seed
giveRandomElement :: Int
giveRandomElement = giveList !! rand where
n = length giveList
(rand, _) = randomR (0,(n-1)) generator
但这可能不起作用,您想要什么。
giveRandomElement
将始终产生相同的结果。它是一个纯函数,没有任何输入,因此该怎么办?它只能是恒定的。
您要么需要使用,要么需要IO
通过代码线程化生成器并在某个地方跟踪它。
您得到的编译器错误:
test.hs:14:23: error:
• Ambiguous type variable ‘g0’ arising from a use of ‘randomR’
prevents the constraint ‘(RandomGen g0)’ from being solved.
Relevant bindings include generator :: g0 (bound at test.hs:14:10)
Probable fix: use a type annotation to specify what ‘g0’ should be.
These potential instance exist:
instance RandomGen StdGen -- Defined in ‘System.Random’
• In the expression: randomR (0, (n - 1)) generator
In a pattern binding:
(rand, generator) = randomR (0, (n - 1)) generator
In an equation for ‘giveRandomElement’:
giveRandomElement
= giveList !! rand
where
n = length giveList
(rand, generator) = randomR (0, (n - 1)) generator
|
14 | (rand, generator) = randomR (0,(n-1)) generator
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
是因为你定义的符号generator
在giveRandomElement
在它自身而言,因此编译器不能推断出它的类型。(generator
在这种情况下,未使用顶层声明,因为(rand, generator) =
等号后的阴影已经遮住了该符号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句