ahm*_*106 1 random recursion haskell range
Heyhey stackoverflowers,
作为一名PHP开发人员,我学到了很多关于编码的知识.用它来开发Python,这是一种非常容易学习的编码语言.不是在大学必须用Haskell写一些代码,这对我来说真的不一样.
我们的任务之一是编写随机生成器.我可以解释一下:
我的想法是用randomNumbers生成一个List.
让我们说:
import Control.Monad (replicateM)
import System.Random
// max random numbers
maxInt = 5
// list
randList = replicateM (fromIntegral maxInt) (randomRIO(1, 6))
Run Code Online (Sandbox Code Playgroud)
这段代码在GHCI中let
用于定义maxInt
和工作正常randList
,但在我的.hs
文件中解释,它不起作用..
这里的错误是:
Ambiguous type variable `a0' in the constraints:
(Num a0)
arising from the literal `1' at code.hs:11:59
(Random a0)
arising from a use of `randomRIO'
at code.hs:11:49-57
Possible cause: the monomorphism restriction applied to the following:
randList :: IO [a0] (bound at code.hs:11:1)
Probable fix: give these definition(s) an explicit type signature
or use -XNoMonomorphismRestriction
In the expression: 1
In the first argument of `randomRIO', namely `(1, 6)'
In the second argument of `replicateM', namely `(randomRIO (1, 6))'
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)
我尝试过很多不同的东西
import System.Random
addToList :: Int -> Int
addToList 0 = [randomRIO(1, 6)]
addToList n = [randomRIO(1, 6)] ++ addToList (n-1)
Run Code Online (Sandbox Code Playgroud)
但我真的很新Haskell和PHP OOP程序员,没有类型问题的Ints,Floats,Lists,Arrays,Haskell对我来说真的很愚蠢;)
谢谢!
发生此错误是因为数字文字在Haskell中被重载,因此只是写入1
可能意味着它是一个Int
,一个Double
或其他一些数字类型,具体取决于上下文.如果它没有完全由上下文确定,Haskell将尝试从默认列表中选择一个类型,但仅当这被认为是安全的时1,即当涉及的唯一类型类是标准类时.
Random
不是标准类型类之一,这就是为什么它不会自己选择Integer
默认类型.您必须自己添加类型注释:
randList = replicateM (fromIntegral maxInt) (randomRIO (1 :: Integer, 6))
Run Code Online (Sandbox Code Playgroud)
要么
randList :: IO [Integer]
randList = replicateM (fromIntegral maxInt) (randomRIO (1, 6))
Run Code Online (Sandbox Code Playgroud)
GHCi对此不那么严格,这就是它在那里工作的原因.
1用户定义的类通常可以针对不同类型执行截然不同的操作.