簡體   English   中英

Haskell遞歸掃描

[英]Haskell Recursion Scanl

我試圖遞歸地傳遞遍歷彼此的不同值以放入函數中。 到目前為止,我有:

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值列表,而我陷入了困境,無法完全正常工作...。

任何建議將不勝感激:),

謝謝

您正在傳遞f ,同時又在重新定義f 盡管這可能不是真正的錯誤,但令人困惑。 考慮一下,請糾正。

iterate有類型

iterate :: (a -> 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]

就類型錯誤而言,您可能想要折疊,例如Data.List foldl'

*Main> :t foldl'
foldl' :: (a -> b -> a) -> a -> [b] -> a
*Main> foldl' (+) 0 [1..5]
15

但是,那並不能解決您的所有問題。 例如,如果getInts是您所暗示的無限列表,則對其的折疊不會終止。

PS:請注意,正如Ingo所指出的, randNumf參數與where子句中定義的f 這是多余的。

對於隨機數,您正在使用類似

nextPseudoRandom n =  n^2 +75 `mod` 234

對? 你也許可以通過做來達到你想要的

randNum = iterate (map nextPseudoRandom) (getInts)

因此逐點產生噪音。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM