尝试生成伪随机整数列表
我正在尝试创建一个 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的新手,所以请告诉我我做错了什么,谢谢!
回答
主要问题是:
- 运算符
::用于注释带有类型签名的表达式。您希望运算符:将元素添加到列表中。 - 在 Haskell 中,多参数函数不像 那样被调用
f(a,b,c)。它们被称为 likef 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
这似乎有效,尽管结果不是很随机,因为我的测试提供了绝对非随机的 list [1..1000]。
您犯的错误表明您还没有掌握编写 Haskell 程序的许多基础知识。希望您已经看到了这个问题,并且正在研究答案中的资源。
您可能还会发现安装和使用 Haskell IDE 很有帮助。我听说 Visual Studio Code 易于使用且运行良好。IDE 会尽早标记语法错误,因此您可以随时修复它们,而不是编写多个函数,然后发现您有许多无法理解且需要以某种方式解决的错误消息。
但是,我认为如果您必须优先考虑其中一个,那么学习更多教程比启动并运行 Haskell IDE 更重要。