[英]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所指出的, randNum
的f
參數與where子句中定義的f
; 這是多余的。
對於隨機數,您正在使用類似
nextPseudoRandom n = n^2 +75 `mod` 234
對? 你也許可以通過做來達到你想要的
randNum = iterate (map nextPseudoRandom) (getInts)
因此逐點產生噪音。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.