簡體   English   中英

Haskell 在列表 n 上執行 function 次數

[英]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.

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