我正在尝试创建一个 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 的新手,所以请告诉我我做错了什么,谢谢!
答案 0 :(得分:5)
主要问题是:
::
用于注释带有类型签名的表达式。您希望运算符 :
将元素添加到列表中。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 更重要。