为什么haskell中的随机数使用随机错误?

为什么haskell中的随机数使用随机错误?,haskell,random,Haskell,Random,我试图打印0和1之间的随机数,但代码给出错误。我无法理解我做错了什么 import System.Random main = print (randomRIO (1,0)) 错误: •没有因使用“打印”而产生的(显示(IO a0))实例 •在表达式中:print(randomRIO(1,0)) 在‘main’的方程式中:main=print(randomRIO(1,0))| 2 | main=print(randomRIO(1,0))|^^^^^^^^^^^^^^^^^^^^^^^ 错误: •

我试图打印0和1之间的随机数,但代码给出错误。我无法理解我做错了什么

import System.Random
main = print (randomRIO (1,0))
错误: •没有因使用“打印”而产生的(显示(IO a0))实例 •在表达式中:print(randomRIO(1,0)) 在‘main’的方程式中:main=print(randomRIO(1,0))| 2 | main=print(randomRIO(1,0))|^^^^^^^^^^^^^^^^^^^^^^^

错误: •使用“randomRIO”产生的不明确类型变量“a0” 防止解决约束“(随机a0)”。 可能的修复:使用类型注释指定“a0”应该是什么。 这些潜在的例子存在: 实例随机整数--在“System.Random”中定义 实例随机布尔值--在“System.Random”中定义 实例随机字符--在“System.Random”中定义 …加上另外四个 …加上29个涉及范围外类型的实例 (使用-fprint潜在实例查看所有实例) •在“print”的第一个参数中,即“(randomRIO(1,0))” 在表达式中:print(randomRIO(1,0)) 在“main”的方程式中:main=print(randomRIO(1,0))

错误: •由文字“1”产生的不明确类型变量“a0” 阻止解决约束“(Num a0)”。 可能的修复:使用类型注释指定“a0”应该是什么。 这些潜在的例子存在: 实例Num Integer--在“GHC.Num”中定义 实例Num Double--在“GHC.Float”中定义 实例Num Float--在“GHC.Float”中定义 …再加上另外两个 …加上35个涉及范围外类型的实例 (使用-fprint潜在实例查看所有实例) •在表达式中:1 在“randomRIO”的第一个参数中,即“(1,0)” 在“print”的第一个参数中,即“(randomRIO(1,0))”| 2 | main=print(randomRIO(1,0))|^

两个三个问题:

print randomRIO (1,0)
读起来像是给
print
函数两个参数。或者,更严格地说,由于应用程序是左关联的,因此其含义与此相同:

(print randomRIO) (1,0)
如果只想给
print
一个参数,则必须将其括起来:

print (randomIO (1,0))
但这就引出了我们的第二个问题
randomRIO
是一个
IO
操作,而不是一个简单的函数。其类型(专门用于教育目的)为

请注意,返回值的形式是
iosomething
randomRIO(1,0)
是一个
IO Int
,但是我们想要打印一个普通的
Int
。要从
IO a
中提取
a
,您需要将函数绑定到
do
块中的变量:

main = do
    r <- randomRIO (1,0)
    print r
(想想看,无论如何,你可能想要一个
Double


我们可以用很多不同的方式指定类型;在
r
上,在
1
0
上,或以明确其类型的方式使用
r
。通常,代码中有足够的上下文线索,只要对顶级函数进行注释,就不需要对任何类似的表达式进行注释。

谢谢您的回答。。但我仍然得到了错误:由于使用了randomRIO@RahulAgarwal-ah-oops,产生了不明确的类型变量'a0',我在ghci中进行了测试,它对此有特殊的规则。固定的
main = do
    r <- randomRIO (1,0)
    print r
main = do
    r <- randomRIO (1, 0)
    print (r :: Int)