为什么haskell中的随机数使用随机错误?
我试图打印0和1之间的随机数,但代码给出错误。我无法理解我做错了什么为什么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))|^^^^^^^^^^^^^^^^^^^^^^^ 错误: •
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)