Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在haskell和ghci中生成范围内的随机数列表时,键入问题_Haskell_Recursion_Random_Range - Fatal编程技术网

在haskell和ghci中生成范围内的随机数列表时,键入问题

在haskell和ghci中生成范围内的随机数列表时,键入问题,haskell,recursion,random,range,Haskell,Recursion,Random,Range,Heyhey stackoverflowers 作为一名PHP开发人员,我学到了很多关于编码的知识。使用它进行Python开发,这是一种非常容易学习的编码语言。不是在大学,我必须和Haskell一起写一些代码,这对我来说真的很不一样 我们的任务之一是编写一个随机生成器。我可以解释: 我的想法是生成一个包含随机数的列表 让我们说: import Control.Monad (replicateM) import System.Random // max random numbers maxInt

Heyhey stackoverflowers

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

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

我的想法是生成一个包含随机数的列表

让我们说:

import Control.Monad (replicateM)
import System.Random

// max random numbers
maxInt = 5
// list
randList = replicateM (fromIntegral maxInt) (randomRIO(1, 6))
此代码在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.
我尝试了很多不同的东西,比如

import System.Random

addToList :: Int -> Int
addToList 0 = [randomRIO(1, 6)]
addToList n = [randomRIO(1, 6)] ++ addToList (n-1)
但是我对Haskell还是一个新手,作为一个PHP OOP程序员,对于int、float、list、array都没有类型问题,Haskell对我来说真的很愚蠢;)


谢谢大家!

之所以发生此错误,是因为Haskell中的数字文本被重载,因此仅编写
1
可能意味着它是
Int
Double
或其他一些数字类型,具体取决于上下文。如果没有完全由上下文决定,Haskell将尝试从默认值列表中选择一个类型,但仅当这被认为是安全的1时,也就是说,仅当涉及的类型类是标准类型时

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

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

,这就是它在那里工作的原因


1用户定义的类通常可能对不同的类型执行完全不同的操作。

发生此错误的原因是Haskell中的数字文本重载,因此仅编写
1
就可能意味着它是
Int
Double
或其他取决于上下文的数字类型。如果没有完全由上下文决定,Haskell将尝试从默认值列表中选择一个类型,但仅当这被认为是安全的1时,也就是说,仅当涉及的类型类是标准类型时

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

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

,这就是它在那里工作的原因


1用户定义的类通常可以为不同的类型执行完全不同的操作。

没有更多的代码行:)是的,我也这么认为,因为如果我直接在ghci中编写代码,它工作得很好。。但是在ghci中有几个bug我打赌你在PHP中遇到过类型问题,你只是从来没有意识到它们是这样的,因为它们不可避免地会导致修复运行时bug变得更加困难。因为Haskell聪明得多(也许有时“太聪明了”,但绝对不愚蠢),这种情况很少发生:在精心设计的Haskell项目中,如果只是在编译器中进行类型检查,您通常可以几乎肯定代码会正常工作。没有更多的代码行:)是的,我也这么认为,因为如果我直接在ghci中编写代码,它工作得很好。。但是在ghci中有几个bug我打赌你在PHP中遇到过类型问题,你只是从来没有意识到它们是这样的,因为它们不可避免地会导致修复运行时bug变得更加困难。因为Haskell聪明得多(也许有时“太聪明了”,但绝对不愚蠢),这种情况很少发生:在设计良好的Haskell项目中,只要代码在编译器中进行类型检查,您就可以几乎肯定代码会正常工作。谢谢,我想我需要更多关于哈斯凯尔的阅读,以正确的方式学习。谢谢,我想我需要更多关于哈斯凯尔的阅读,以正确的方式学习。