Haskell递归Scanl

时间:2013-11-17 21:54:27

标签: list function loops haskell recursion

我试图以递归的方式传递不同的值,使其相互循环以放入函数中。到目前为止我有这个:

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值设置一个不断修改的列表,我被卡住了,并且不能让它正常工作....

非常感谢任何建议:),

由于

3 个答案:

答案 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)

如此产生的噪音。