我试图以递归的方式传递不同的值,使其相互循环以放入函数中。到目前为止我有这个:
randNum f = take 20 (iterate f 300)
where f n = scanl (mod') (n*2 + 75) getInts
(getInts
只是cycle
和数字列表)
然后以下列方式使用randNum
函数:
randGenPoints :: [Point]
randGenPoints = pairs (randNum 1)
但是我有一个问题,randNum
我收到此错误:
*** Expression : iterate f 300
*** Term : f
*** Type : Integer -> [Integer]
*** Does not match : [Integer] -> [Integer]
我想要的只是在我的函数中为mod值设置一个不断修改的列表,我被卡住了,并且不能让它正常工作....
非常感谢任何建议:),
由于
答案 0 :(得分:0)
您正在传递f
,同时您正在重新定义f
。虽然这可能不是真正的错误,但却令人困惑。考虑一下,请更正。
答案 1 :(得分:0)
iterate
的类型为
iterate :: (a -> a) -> a -> [a]
它需要a -> a
类型的函数,在您的情况下,它专用于Integer -> Integer
。但是,您在where子句中定义的f
的类型为Integer -> [Integer]
。之所以发生这种情况是因为scanl
,而不仅仅是将列表缩减为具有某些二元函数的值,而是返回一个包含所有中间值的列表:
*Main> :t scanl
scanl :: (a -> b -> a) -> a -> [b] -> [a]
*Main> scanl (+) 0 [1..5]
[0,1,3,6,10,15]
就类型错误而言,您可能需要折叠,例如来自foldl'
的{{1}}。
Data.List
然而,这并不能解决你所有的问题。例如,如果*Main> :t foldl'
foldl' :: (a -> b -> a) -> a -> [b] -> a
*Main> foldl' (+) 0 [1..5]
15
是您所暗示的无限列表,则其上的折叠将不会终止。
P.S。:请注意,正如Ingo指出的那样,getInts
的{{1}}参数与where子句中定义的f
不同;这是多余的。
答案 2 :(得分:-1)
对于随机数,您使用的是
nextPseudoRandom n = n^2 +75 `mod` 234
正确?你可以做到你想做的事情
randNum = iterate (map nextPseudoRandom) (getInts)
如此产生的噪音。