[英]Haskell perform function on list n number times
我正在使用 Haskell 學習函數式編程。 我正在嘗試創建一個 function ,它采用 function f
,並在某些輸入x
上執行n
次。
(a -> a) -> a -> Int -> [a]
repeat f x n
所以,output 列表是這樣的:
[x, f(x), f(f(x)), ..., f^n(x)]
到目前為止,我已經能夠想出一個 function 我相信這樣做,但我不知道如何約束它,所以它只執行 n 次:
fn f a = (f a) : (fn f (f a))
有人可以幫忙嗎? 謝謝!
您只需要指定兩種不同的情況:一種情況下發生遞歸並且列表繼續,另一種情況下不發生遞歸,並且需要某種方式來決定這些情況。 第三個參數n
看起來恰到好處:
fn f a 0 = []
fn f a n = f a : fn f (f a) (n-1)
我來這里是為了提供另一種方式(只是為了好玩)。
庫中有一個非常相似的 function: scanl scanl:: (b -> a -> b) -> b -> [a] -> [b]
,它執行:
scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...]
這與您想要做的非常相似。 所以我們可以寫:
fn :: (a -> a) -> a -> Int -> [a]
fn f a n = scanl (\x _ -> f x) a (replicate n ())
-- or you can write:
-- fn f a n = scanl (const . f) a (replicate n ())
在(\x _ -> fx)
中,我們丟棄了第二個參數(即()
)。
注意它是如何工作的:
fn f a n == [a, (\x _ -> f x) a (), (\x _ -> f x) ((\x _ -> f x) a ()) (), ...]
== [a, f a, f (f a), ...]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.