1

嘿嘿stackoverflowers,

作为一名 PHP 开发人员,我学到了很多关于编码的知识。用于使用 Python 进行开发,Python 是一种非常容易学习的编码语言。不是在大学里,我必须用 Haskell 写一些代码,这对我来说真的很不一样。

我们的任务之一是编写一个随机生成器。我可以解释一下:

我的想法是生成一个带有随机数的列表。

让我们说:

import Control.Monad (replicateM)
import System.Random

// max random numbers
maxInt = 5
// list
randList = replicateM (fromIntegral maxInt) (randomRIO(1, 6))

此代码在 GHCI 中使用let定义maxIntand可以正常工作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.

我尝试了非常不同的事情,比如

import System.Random

addToList :: Int -> Int
addToList 0 = [randomRIO(1, 6)]
addToList n = [randomRIO(1, 6)] ++ addToList (n-1)

但我对 Haskell 和 PHP OOP 程序员真的很陌生,没有整数、浮点数、列表、数组的类型问题,Haskell 对我来说真的很愚蠢;)

谢谢!

4

1 回答 1

7

发生此错误是因为在 Haskell 中重载了数字文字,因此仅写入1可能意味着它是 a Int、 aDouble或其他数字类型,具体取决于上下文。如果它没有完全由上下文确定,Haskell 将尝试从默认列表中选择一个类型,但只有当这被认为是安全的1时,即当涉及的唯一类型类是标准类型时。

Random不是标准类型类之一,这就是为什么它不会自行选择Integer为默认值的原因。您必须自己添加类型注释:

randList = replicateM (fromIntegral maxInt) (randomRIO (1 :: Integer, 6))

或者

randList :: IO [Integer] 
randList = replicateM (fromIntegral maxInt) (randomRIO (1, 6))

GHCi 对此没有那么严格,这就是它在那里工作的原因。

1用户定义的类通常可能为不同的类型做完全不同的事情。

于 2013-04-18T21:59:14.857 回答