尝试生成伪随机整数列表

时间:2021-06-23 00:04:15

标签: haskell

我正在尝试创建一个 Int 随机数列表,该列表是通过从另一个 1000 个随机数列表中获取 62 个数字来制作的,该列表从一个随机索引开始,该索引是该函数的输入之一。这是我目前拥有的:

num :: [Int]->Int->[Int]
num list index = numGenerator list index 62
numGenerator :: [Int]->Int->Int->[Int]
numGenerator list index counter 
    | counter == 0 = []
    | otherwise = list !! index :: numGenerator((list), (index + 1),(counter - 1))
 main = do
    let numGen =  num 100 

我是 Haskell 的新手,所以请告诉我我做错了什么,谢谢!

1 个答案:

答案 0 :(得分:5)

主要问题是:

  • 运算符 :: 用于注释带有类型签名的表达式。您希望运算符 : 将元素添加到列表中。
  • 在 Haskell 中,多参数函数不像 f(a,b,c) 那样被调用。它们被称为 f a b c ,并在必要时添加括号。您对 numGenerator 的递归调用需要修正以匹配正确的语法。
  • 缩进很重要 -- main 必须与 numGenerator 在同一列中开始。
  • main 中,您调用 num 100,但 num 需要一个列表和一个整数,而不仅仅是一个整数。
  • main 中,您的 do-block 以 let 语句结束。那是不允许的。您需要以 IO 操作结束它,例如打印结果或其他内容。

解决这个问题,你会得到类似的东西:

num :: [Int] -> Int -> [Int]
num list index = numGenerator list index 62

numGenerator :: [Int] -> Int -> Int -> [Int]
numGenerator list index counter
    | counter == 0 = []
    | otherwise = list !! index : numGenerator list (index + 1) (counter - 1)

main = do
  let numGen =  num [1..1000] 100
  print numGen

这似乎有效,尽管结果不是很随机,因为我的测试提供了绝对非随机的列表 [1..1000]

您犯的错误表明您还没有掌握编写 Haskell 程序的许多基础知识。希望您已经看过 this question 并且正在研究答案中的资源。

可能还会发现安装和使用 Haskell IDE 很有帮助。我听说 Visual Studio Code 易于使用且运行良好。 IDE 会及早标记语法错误,因此您可以随时修复它们,而不是编写多个函数,然后发现您有许多无法理解且需要以某种方式解决的错误消息。

但是,如果您必须优先考虑其中一个,我认为学习更多教程比启动并运行 Haskell IDE 更重要。